수색…


소개

이 주제는 PHP로 구현 된 잘 알려진 디자인 패턴의 예제를 제공합니다.

PHP의 메소드 체이닝

Method Chaining은 마틴 파울러 (Martin Fowler)의 도메인 특정 언어 (Domain Specific Languages) 에서 설명한 기술입니다. 방법 체이닝은 다음과 같이 요약됩니다.

하나의 표현식에서 여러 수정자가 호출 될 수 있도록 수정 자 메소드가 호스트 객체를 반환하도록합니다 .

이 비 연결 / 정상 코드를 생각해보십시오 (앞에서 설명한 PHP에서 이식되었습니다)

$hardDrive = new HardDrive;
$hardDrive->setCapacity(150);
$hardDrive->external();
$hardDrive->setSpeed(7200);

메서드 체이닝을 사용하면 위의 명령문을보다 간결하게 작성할 수 있습니다.

$hardDrive = (new HardDrive)
    ->setCapacity(150)
    ->external()
    ->setSpeed(7200);

이 작업을하기 위해서 필요한 것은 연쇄하고 싶은 메서드에서 return $thisreturn $this 하는 것입니다.

class HardDrive {
    protected $isExternal = false;
    protected $capacity = 0;
    protected $speed = 0;

    public function external($isExternal = true) {
        $this->isExternal = $isExternal;        
        return $this; // returns the current class instance to allow method chaining
    }

    public function setCapacity($capacity) {
        $this->capacity = $capacity;        
        return $this; // returns the current class instance to allow method chaining
    }

    public function setSpeed($speed) {
        $this->speed = $speed;        
        return $this; // returns the current class instance to allow method chaining
    }
}

언제 사용 하는가?

Method Chaining을 사용하는 주요 사용 사례는 내부 도메인 특정 언어를 구축 할 때입니다. Method Chaining은 Expression BuildersFluent Interfaces 의 빌딩 블록 입니다. 그것은 그 (것)들과 동의어가 아니다, 그러나 . Method Chaining은 그것들을 가능하게 만합니다. 파울러를 인용 :

또한 많은 사람들이 유창한 인터페이스를 메소드 체이닝과 동일시하는 것으로 보입니다. 확실하게 연쇄는 유창한 인터페이스와 함께 사용하는 일반적인 기술이지만 실제 유창성은 그 이상입니다.

그 말로는 호스트 객체를 쓰는 것을 피하기 위해서만 메소드 체이닝을 사용하는 것은 많은 사람들이 코드 냄새 라고 생각합니다. 특히 비 연결 API와 혼합 할 때 잘 알려지지 않은 API를 만듭니다.


추가 참고 사항

명령 쿼리 분리

명령 질의 분리는 Bertrand Meyer가 제시 한 설계 원칙 입니다. 상태 ( 명령 )를 변경하는 메소드는 아무 것도 리턴하지 않아야하며, 무언가를 리턴하는 메소드 ( 조회 )는 상태를 변경해서는 안된다. 이렇게하면 시스템에 대해 쉽게 추론 할 수 있습니다. Method Chaining은 우리가 국가에 돌연변이를 일으키고 무언가를 돌려 주고 있기 때문에이 원칙에 위배됩니다.

게터

메소드 체인을 구현하는 클래스를 사용할 때는 getter 메소드 (즉, $this 이외의 것을 리턴하는 메소드)를 호출 할 때 특히주의하십시오. 게터가 아닌 값 반환해야하기 때문에 $this , 게터에 추가 방법을 체인은 전화가 아니라 원래 개체에서받은 값에서 작동합니다. 체인 된 getter에 대한 몇 가지 유스 케이스가 있지만 코드를 읽기 쉽게 만들 수 있습니다.

Demeter의 법칙과 시험에 대한 영향

위에서 제시된 방법 체이닝 은 Demeter의 법칙을 위반하지 않습니다. 또한 테스트에 영향을 미치지 않습니다. 우리가 일부 공동 작업자가 아닌 호스트 인스턴스를 반환하기 때문입니다. Fluent InterfacesExpression Builder로 단순한 Method Chaining을 혼동하는 사람들로부터 발생하는 일반적인 오해입니다. Method Chaining 이 호스트 객체 이외의 다른 객체를 반환 할 때만 Demeter의 법칙을 위반하고 테스트에서 모의 ​​페스트로 끝납니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow