2009-07-26 17 views
1

私は自分の利益のためにしばらくの間、自分の小さなフレームワークに取り組んできました。ご想像のとおり、私はレジストリオブジェクトを持っています。シングルトンと対話する最も効率的な方法は何ですか?

は現時点では、最も基本的なオブジェクト(AFObjectは)だから、すべてのオブジェクトが現在のレジストリへのローカル参照が含まれています。この

absract class AFObject { 

    var $_registry; 

    function __construct(){ 
     $this->_registry = AFRegistry::getInstance(); 
    } 

} 

のように少し設定されています。ですから、1回に何百ものオブジェクトがインスタンス化されていれば、それは何百ものシングルトンへの参照です。しかし、それは

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::$foo = $bar; 
    } 

} 
+2

php 5のvarキーワードの代わりにpublic、protected、またはprivateを使用する必要があります。 –

答えて

0

...いつものように、直接レジストリを参照するために、多かれ少なかれ、効率的である私は、100個の参照は本当に問題ではありませんので、(この場合には、効率を考えるべきではないと思います、少し時期尚早の最適化です)。しかし、あなたのコードで最もエレガントなものを考えてみてください。また、シングルトンが必要かどうかを検討してください(静的クラスとして実装できますか?)。私はあなたのコードをもう少し明白にしているので、おそらくあなたの2番目のケースを使うことを選ぶでしょう(少なくとも私はそう考えています)。

その場合、

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->$foo = $bar; 
    } 

} 

それとも、あなたの財産をカプセル化する場合は、次のようになります。

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->setFoo($bar); 
    } 

} 
2

smellsのクラスの種類の私の意見では、「レジストリ」タイプでは。

あなたは学習のためにこれをやっていると言いましたので、あなたのレジストリクラスを完全に根絶し、別の方法をとってみたことがありますか?おそらく、必要なデータをクラスの内部から取り出すのではなく、クラスのコンストラクタにプッシュしますか?

私はその後、すべてのあなたのクラスは、いくつかの他のクラスに依存するようになるので... Yngve Sneenが述べたように、静的クラスを使用して

が私の中に最善のアプローチとなり、オプション1(抽象基底クラス)を除外したいですあなたがレジストリの設定を保存したい場合は、

次のようになります。 registry :: set( 'var1'、$ var1); $ var1 = registry :: get( 'var1');

1

はこのことを考えてみましょう:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    global $af_registry; 
    $af_registry->setFoo($bar); 
    } 
} 

かさえ:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    af_registry_set('foo', $bar); 
    } 
} 

バー構文は、基本的にこれとあなたの現在のソリューションとの間に違いはありません。

はい、レジストリは本質的にグローバル変数です。そして、はい、グローバル変数には問題があります。より良い選択肢はpass in the dependenciesです。

関連する問題