簡體   English   中英

與Singleton交互的最有效方法是什么?

[英]What's the most efficient way to interact with a Singleton?

為了我自己的利益,我已經在自己的小框架上工作了一段時間,在學習新知識的同時不斷地回顧代碼。 如您所料,我有一個Registry對象,幾乎所有其他對象都在使用該對象。

目前,最基本的對象(AFObject)設置如下

absract class AFObject {

    var $_registry;

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

}

因此,每個對象現在都將包含對注冊表的本地引用。 因此,如果我一次實例化了數百個對象,那么這就是對單例的數百個引用。 但是總是像這樣直接引用注冊表會或多或少有效...

class AFRouter extends AFObject {

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

}

我認為,“注冊”類型的類有點氣味

既然您提到您是為了學習和變得更好而這么做,那么您是否曾經考慮過徹底消除注冊表類並采取其他方法? 也許將所需的數據推送到類構造函數,而不是從類內部提取數據?

我將省略選項1(抽象基類),因為那樣您的所有類都將依賴於其他一些類...

如果您確實希望保留注冊表設置,那么在我看來,使用像Yngve Sneen這樣的靜態類將是最好的方法。

類似於:registry :: set('var1',$ var1); $ var1 =注冊表:: get('var1');

考慮一下:

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);
  }
}

除去語法,此方法與當前解決方案之間基本上沒有區別。

是的,這意味着您的注冊表實質上是一個全局變量。 是的,全局變量存在問題。 更好的選擇是傳遞依賴項

在這種情況下,我認為您不應該考慮效率(因為100個引用確實不是問題,並且有點過早的優化)。 但是請考慮一下代碼中最優雅的內容。 另外,考慮是否需要單例(可以實現為靜態類嗎?)。 我可能會選擇使用第二種情況,因為這會使您的代碼更加明顯(至少我認為是這樣)。

在那種情況下

class AFRouter extends AFObject {

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

}

或者,如果您封裝了屬性:

class AFRouter extends AFObject {

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM