2014-07-17 46 views
1

我想這可能是一個愚蠢的問題,但我無法將我的頭包裹在它上面。在構造函數中委託工作vs方法

所以我有一些代碼,看起來像這樣:

$process = new ProcessTree(); 
$process->start(); 

和類processTree是:

class ProcessTree() 
{ 
    public function __construct() 
    {} //dummy constructor... 
} 

public function start() 
{ 
    $this->init(); 
    $this->doThis(); 
    $this->doThat(); 
    //etc... 
} 

所以我想我的問題是關於虛擬構造函數。根據良好的設計,施工人員不應該做些什麼?甚至,start()的身體不應該在__construct()之內嗎?

+0

如果每次調用該類時,都立即調用該方法,在構造函數中調用該方法。 –

回答

1

一般而言,構造函數不應該「太多」,因爲這會違反單一責任原則:構造函數的責任是準備要使用的對象,因此它的操作應該被限制爲。

當然,各種規則都會有例外。例如,PDO的構造函數初始化一個數據庫連接,這並不是真正需要的。但在PDO方面,這是有道理的,因爲:

  • 你總是會想使這方面(和宜早不宜遲)
  • 總有一種現實的可能性,該連接不會成功(所以通過讓構造函數連接並拋出失敗,您可以方便地檢查它)
  • 如果PDO構造函數沒有連接或拋出,則所有其他方法都必須做好相同的準備。但PDO的錯誤報告策略可以切換到返回碼;在這種情況下,你將被迫在整個代碼中撒上「連接失敗」的邏輯。這將是一個非常不幸的結果,但是通過連接構造函數可以一勞永逸地阻止它。

但是作爲一個經驗法則,每當有疑問時都不要在構造函數中做某事。

1

如果你不需要它,你不需要使用構造函數。我不認爲這是一個最好的做法,只是把一個空的構造函數。

您也應該不要將代碼從start()移到構造函數中。構造函數只應該幫助初始化對象(例如設置一些屬性),並且如果您想要執行某些操作,則應該簡單地運行這些方法或創建包裝器方法(如您一樣)以一次運行多個方法。

當然我們不知道你在做什麼init(),doThis()doThat()方法。如果他們做的動作總是需要使用其他對象的方法,那麼可以將它們移動到構造器中,但正如我所說的,我們不知道它們中的代碼是什麼。

+0

所調用的函數只是執行一些業務邏輯實現,其中的細節實際上不會影響問題。謝謝您的回答! –