2012-06-01 99 views
2

MyClass有一個字段反彈,其中每個值取決於另一個實例值,最後在DependencyClass上。一個很簡單的例子:PHP的構造函數和相互依賴的域的反彈

方案A(使用構造函數)

public class MyClass 
{ 
    private $myField1, $myField2; 

    public function MyClass(DependencyClass $dependency) 
    { 
     $value = $dependency->getValue(); 
     $value++; // Computations on dependency value 

     $this->myField1 = $value + 3; 
     $this->myField2 = $value - 1; 
    } 

    public function getMyField1() 
    { 
     return $this->myField1; 
    } 

    public function getMyField2() 
    { 
     return $this->myField2; 
    } 
} 

我的問題是,是類的構造函數,我應該把這個計算邏輯正確的地方?還是會比較appropropriate做一些重複代碼,如:(僅適用於依賴構造函數)

溶液B

public class MyClass 
{ 
    private $dependency; 

    public function MyClass(DependencyClass $dependency) 
    { 
     $this->dependency= $dependency 
    } 

    public function getMyField1() 
    { 
     $value = $this->dependecy->getValue(); 
     $value++; // Computations on dependency value 

     return $value + 3; 
    } 

    public function getMyField2() 
    { 
     $value = $this->dependecy->getValue(); 
     $value++; // Computations on dependency value 

     return $value - 1; 
    } 
} 

或使MyClass僅僅是一個容器和用戶外部彙編類,如:

解決方案C(外部彙編)

Class Assembler 
{ 
    public getMyClass() 
    { 
     $dependency = new Dependency(); 
     $value  = $dependency->getValue(); 
     $value++; // Computations on dependency value 

     $myClass = new MyClass(); 
     $myClass->setMyField1($value + 3); 
     $myClass->setMyField2($value - 1); 

     return $myClass; 
    } 

} 
+1

我想說這取決於一點,但是解決方案B看起來對我來說最直接,當代碼增長時,這通常是很好的選擇。另外我認爲你已經簡化了這個例子,並且在你這樣做的時候它可能已經失去了問題。 – hakre

回答

1

答案是 「看情況」。你想達到什麼目的?

使用解決方案A和B,您已將耦合到依賴關係,並將計算作爲MyClass對象的內在部分:MyClass不存在於依賴關係中,並且它總是以某種方式使用依賴關係。另一方面,解決方案C將MyClass與Dependency完全分離,使MyClass成爲一個簡單的數據對象。

所以問題是哪個更具體的情況下在給定時刻面臨你的問題。你希望MyClass中的數據能夠在未來以各種方式構建,還是希望它始終由依賴創建?

+0

非常有幫助,謝謝。 – Polmonino

1

這取決於你的情況和需求。

如果你的計算很簡單並且總是使用,我會把它們放在ctor中。 (解決方案A)

如果其中一個計算複雜和/或不總是被使用,我會選擇在訪問器中進行「懶惰評估」,並在訪問器計算結果後緩存結果。 (解決方案B,但我會添加結果的緩存)。

我建議不要解決方案C.它實際上只是在不同範圍內的構造函數,因此您的類沒有內聚性。它隱藏了對另一個類的依賴關係。這使得難以測試,因爲其他班級不能被嘲笑或扼殺。這個類沒什麼理由存在 - 它和只讀數組差不多。