수색…
소개
이 주제는 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 $this
를 return $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 Builders 와 Fluent Interfaces 의 빌딩 블록 입니다. 그것은 그 (것)들과 동의어가 아니다, 그러나 . Method Chaining은 그것들을 가능하게 만합니다. 파울러를 인용 :
또한 많은 사람들이 유창한 인터페이스를 메소드 체이닝과 동일시하는 것으로 보입니다. 확실하게 연쇄는 유창한 인터페이스와 함께 사용하는 일반적인 기술이지만 실제 유창성은 그 이상입니다.
그 말로는 호스트 객체를 쓰는 것을 피하기 위해서만 메소드 체이닝을 사용하는 것은 많은 사람들이 코드 냄새 라고 생각합니다. 특히 비 연결 API와 혼합 할 때 잘 알려지지 않은 API를 만듭니다.
추가 참고 사항
명령 쿼리 분리
명령 질의 분리는 Bertrand Meyer가 제시 한 설계 원칙 입니다. 상태 ( 명령 )를 변경하는 메소드는 아무 것도 리턴하지 않아야하며, 무언가를 리턴하는 메소드 ( 조회 )는 상태를 변경해서는 안된다. 이렇게하면 시스템에 대해 쉽게 추론 할 수 있습니다. Method Chaining은 우리가 국가에 돌연변이를 일으키고 무언가를 돌려 주고 있기 때문에이 원칙에 위배됩니다.
게터
메소드 체인을 구현하는 클래스를 사용할 때는 getter 메소드 (즉, $this
이외의 것을 리턴하는 메소드)를 호출 할 때 특히주의하십시오. 게터가 아닌 값 반환해야하기 때문에 $this
, 게터에 추가 방법을 체인은 전화가 아니라 원래 개체에서받은 값에서 작동합니다. 체인 된 getter에 대한 몇 가지 유스 케이스가 있지만 코드를 읽기 쉽게 만들 수 있습니다.
Demeter의 법칙과 시험에 대한 영향
위에서 제시된 방법 체이닝 은 Demeter의 법칙을 위반하지 않습니다. 또한 테스트에 영향을 미치지 않습니다. 우리가 일부 공동 작업자가 아닌 호스트 인스턴스를 반환하기 때문입니다. Fluent Interfaces 및 Expression Builder로 단순한 Method Chaining을 혼동하는 사람들로부터 발생하는 일반적인 오해입니다. Method Chaining 이 호스트 객체 이외의 다른 객체를 반환 할 때만 Demeter의 법칙을 위반하고 테스트에서 모의 페스트로 끝납니다.