2012-06-01 5 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 다음과 같습니다 (전용 종속성에 대한 생성자를)

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

솔루션 B 또는 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의 데이터를 앞으로 다양한 방법으로 구성 할 수 있도록 하시겠습니까? 아니면 항상 Dependency에서 만들길 원하십니까?

+0

매우 도움이됩니다. 감사합니다. – Polmonino

1

귀하의 상황과 필요에 따라 다릅니다.

계산이 간단하고 항상 사용된다면 나는 그것을 ctor에 넣을 것입니다. (솔루션 A)

계산 중 하나가 복잡하거나 항상 사용되지 않는 경우 접근자가 "게으른 평가"를 선택하고 접근자가 결과를 캐시하면 결과가 캐시됩니다. (솔루션 B,하지만 결과 캐싱을 추가 할 것이다).

나는 솔루션 C에 대해 권장합니다. 실제로는 다른 범위의 생성자이므로 클래스가 응집력이 약합니다. 다른 클래스에 대한 종속성을 숨 깁니다. 다른 클래스를 조롱하거나 스터브 할 수 없기 때문에 테스트하기가 어렵습니다. 클래스가 존재할 이유는 거의 없습니다. 읽기 전용 배열과 거의 같습니다.