2011-09-12 9 views
1

なぜSingletonパターンの代わりにZend_Registryを使うべきですか?Singeltonパターンの代わりにZend_Registryを使う理由は?

私の同僚と私は最近これについて議論しました。彼の指摘は、すべての一貫性のあるオブジェクトに対してZend_Registryを使用する必要があるということでしたが、Zend_Registryは同じことをするだけでラップされているので、シングルトンパターンを使用したかったのです。 データベースがなZend_Registryになっていないことをtheresのチャンスので

$list = Zend_Registry::get('database')->getList($sql);

は、私はこのようなコードに問題があります。遅延読み込みの場合は、システムの特定のオブジェクトに関する情報を自分のレジストリに登録する必要があります。データベースがロード時に特定のパラメータを取る場合と同様に、これを知る必要があります。

私は代わりにgetInstanceを使用し、すべてのコードが同じオブジェクトに存在します。それは理にかなっていますか?

+0

あなたはここでかなりの意見を持っています:http://stackoverflow.com/questions/1967363/registry-or-singleton and here:http://stackoverflow.com/questions/2101943/registry-or-singleton -pattern-in-php – dinopmi

+0

http://www.phppatterns.com/docs/design/the_registry – SMka

+0

私は自分の小さなMCを持っています。私は最初にシングルトンaproachを使い始めました。それは大丈夫でした。しかし、時間の経過とともに、コードがより最適化されている間に、レジストリaproachはsingletinがやることができることといくつかのことを行うことができました。残念なことに、それ以来数ヶ月が経過しており、シングルトン以上の正確なメリットは覚えていません。 – Melsi

答えて

1

単純なブログや何かのためのものです。それ以外の場合は、DBインスタンスが1つしか使用できません。そして、それはあなたが長期的に望むものではありません。他のサーバーに接続する(エラーをセントラル・データベースに記録する、誰かから製品をインポートする、など)、または異なるユーザーとして接続することができます(セキュリティ上の理由から、APIにadmin_users表、最初にユーザーが有効かどうかを確認するには、それに接続する必要があります)。

目的レジスタ(My_Db_Admin、My_Db_ReadOnly、...)を使用することはできますが、それはあまり意味がありません。レジストリを使用すると、1つのインスタンスに悩まされることはありません。 )外のレジストリを作成してしばらくそれを処理してからゴミ箱に入れてください;)

2

あなたはあなたの質問を/または、あなたの3番目の選択肢を示唆するかもしれませんが?

シングルトンとZend_Registryは、実際にはグローバルとして機能するため、可能な限り避けるようにしています。コードセグメントがシングルトンやグローバルレジストリへの呼び出しを介してグローバルなetherに到達すると、必要なものを得るために、隠された、あるいは少なくとも非明示的な依存関係が生成され、デバッグが難しくなりますユニットテスト。

対照的に、私は従属性アドバイスのアドバイスに従い、「必要なものを提供してください。必要なものを見つけ出さないでください」と言います。

レジストリ/シングルトンdb接続、ロガーなどが必要なほとんどのエンティティでは、Bootstrapに作成し、Bootstrapレジストリに保存して、通常はコントローラに挿入しますinit()の間に$this->getInvokeArg('bootstrap')->getResource('myResource')を使用してください。コントローラのみがBootstrapに戻ります。次に、これらの依存関係を必要とするモデルまたはサービスは、コンストラクタまたはセッタ注入のいずれかによってコントローラによって明示的に渡されます。

時々私が後退するハイブリッドアプローチは、これらの依存関係のゲッター/セッターでサービス/モデルクラスを設計することです - getDbAdapter()setDbAdapter(); getLogger()setLogger()などです。ゲッタは、シングルトンであろうとZend_Registryであろうと、グローバルレジストリから怠惰にロードされ、期待されない場所で例外をスローします。その意味では、それはあなたが示唆しているものに似ています。純粋依存性注入哲学に違反している。しかし、少なくともgetter/setterメソッドが存在することは、依存関係が存在することを明示的に示しており、それを模擬したり、デフォルト以外の実装を提供したりすることができます。

関連する問題