2013-04-24 2 views
1

생성자 인수에 따라 다르게 응답하는 클래스가있는 경우 해당 클래스의 스펙을 작성하려면 어떻게해야합니까?생성자 인수에 따라 다르게 동작하는 클래스의 사양 작성

class Route 
{ 
    function __construct($url, array $methods = array()) 
    { 
    // stores methods and url in private member variables 
    // creates a regex to match $url against incoming request URLs 
    } 

    public function isMatch($url) 
    { 
    // checks if the incoming request url matches against this url 
    } 
} 

사용 예 : 나는 phpspec에서하자 기능을 사용하여이 클래스 내 사양을 설정하면

$a = new Route('/users/:id'); 
$a->isMatch('/users/1') // returns true; 
$b = new Route('/users'); 
$b->isMatch('/users') // returns true 

가 :

class Route extends ObjectBehaviour 
{ 
    function let() 
    { 
    $this->beConstructedWith('/users/:id') 
    } 
} 

내 사양 만 확인할 수있는 경우이의 행동 클래스는 하나의 경우에서 작동합니다.

필자는이 문제를 해결하기 위해 setter 메서드를 추가 할 계획을 세웠지 만 테스트 목적으로 캡슐화를 중단하는 것처럼 보입니다.

나는 이것에 접촉하는 것을 찾기 위해 고심하고 있습니다. 그래서 이것은 아마도 나쁜 코드 냄새 상황이라고 생각하기 시작했습니다.

+0

beConstructedWith()는 let() 메서드에서 항상 호출 할 필요는 없습니다. 사양에서 호출 할 수도 있습니다. –

답변

1
  1. 생성자는 여기에서 멤버 속성으로 설정할 변수를 가져 오는 데에만 사용해야합니다. 여기에 더 이상 논리가 없어야합니다 ...
  2. 1 번 아이디어는 다음에 무슨 일이 일어나는지를 결정하는 또 다른 논리가 있어야합니다 (예 : if Object->hasProperty(X) then do x() 등)
  3. 그런 다음 댓글은 간단하고 직설적입니다.

예 :

class Route 
{ 
    private $url; 
    private $methods = array(); 

    /** 
    * Constructor method, sets the attributes to private member variables 
    * @param string $url URL pattern 
    * @param array $methods Methods that should be used with given URL 
    */ 
    function __construct($url, $methods = array()) 
    { 
     $this->url  = $url; 
     $this->methods = $methods; 
    } 

    // ... 

} 
+0

그래,하지만 내가 생성자 밖에서 정규 표현식을 만드는 로직을 옮기더라도 문제는 여전히 한 가지 이상의 방식으로 클래스를 설정할 수 없다는 점에서 스펙 내에 남아있을 것이다. – Oodar

+0

그러면 나쁜 접근 방법이 있습니다. 클래스에는 생성자로 푸시하는 변수에도 불구하고 항상 단 하나의 구체 표현 만 있어야합니다. 당신은 인자에 따라 다른 행동을해야합니다 가능한 각각의 행동을 처리하는 더 많은 클래스를 사용해야합니다 ... 논리는 어떤 클래스를 인스턴스화할지 결정합니다. – shadyyx

+0

좋습니다. 몇 가지 아이디어에 대한 좋은 출발점, 환호. – Oodar

3

beConstructedWith() 항상 let() 방법에서 호출 할 필요가 없습니다. 사양에서 호출 할 수도 있습니다.

내 의견으로는 두 가지 이상의 방법으로 개체를 설정하는 데는 아무 문제가 없습니다. 그러나 doing too much work in the constructor을 피해야합니다.

관련 문제