2012-06-01 42 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.它实际上只是在不同范围内的构造函数,因此您的类没有内聚性。它隐藏了对另一个类的依赖关系。这使得难以测试,因为其他班级不能被嘲笑或扼杀。这个类没什么理由存在 - 它和只读数组差不多。