물론 우리는 그 구성과 위임 이라고 부릅니다 . 전략 패턴과 의존성 주입은 구조적으로 비슷해 보이지만 의도는 다릅니다.
전략 패턴 은 동일한 인터페이스에서 동작의 런타임 수정을 허용합니다. 나는 청둥 오리 오리에게 날아 다니며 날아가는 날개를 볼 수 있습니다. 그런 다음 제트 파일럿 덕으로 바꾸고 델타 항공과 함께 날아가는 것을 지켜보십시오. 프로그램이 실행되는 동안하는 것은 전략 패턴입니다.
Dependency Injection 은 하드 코딩 종속성을 방지하여 변경시 클라이언트를 수정하지 않고도 독립적으로 변경할 수있는 기술입니다. 고객은 어떻게 충족 될지 모릅니다. 따라서 그들이 어떻게 충족되는지는 다른 곳에서 결정됩니다 (일반적으로 주된). 이 기술을 사용하기 위해 오리 두 마리가 필요하지 않습니다. 오리를 모르거나 돌보지 않고 오리를 사용하는 것. 오리를 만들거나 찾아 보지 않지만 손에 든 오리를 사용하는 것은 행복합니다.
구체적인 오리 클래스가 있다면 플라이 동작을 구현할 수 있습니다. 상태 변수를 기반으로 동작을 날개가있는 플라이에서 델타가있는 플라이로 전환하도록 할 수도 있습니다. 그 변수는 부울, int 또는 if로 테스트하지 않고도 모든 비행 스타일을 수행 FlyBehavior
하는 fly
메소드 가있는 메소드 일 수 있습니다 . 이제 오리 유형을 변경하지 않고도 비행 스타일을 변경할 수 있습니다. 이제 청둥 오리는 조종사가 될 수 있습니다. 이것은 구성과 위임 입니다. 오리는 FlyBehavior로 구성되어 있으며 비행 요청을 위임 할 수 있습니다. 이 방법으로 모든 오리 동작을 한 번에 바꾸거나 각 동작 또는 그 사이의 조합에 대해 무언가를 유지할 수 있습니다.
이것은 하나를 제외하고 상속이 가진 동일한 힘을 모두줍니다. 상속을 사용하면 Duck 하위 유형에서 재정의하는 Duck 메소드를 표현할 수 있습니다. 구성 및 위임을 위해서는 Duck이 처음부터 하위 유형에 명시 적으로 위임해야합니다. 이것은 훨씬 유연하지만 더 많은 키보드 입력이 필요하며 Duck은 그것이 일어나고 있음을 알아야합니다.
그러나 많은 사람들은 상속이 처음부터 명시 적으로 설계되어야한다고 생각합니다. 그리고 그렇지 않은 경우 상속을 허용하지 않도록 클래스를 봉인 / 최종으로 표시해야합니다. 그러한 견해를 취한다면 상속은 실제로 구성과 위임보다 이점이 없습니다. 따라서 어느 쪽이든 처음부터 확장 성을 위해 디자인하거나 나중에 물건을 찢어 버릴 수 있어야하기 때문입니다.
물건을 찢는 것은 실제로 인기있는 옵션입니다. 문제가있는 경우가 있다는 것을 명심하십시오. 다음 릴리스로 업데이트하지 않으려는 라이브러리 또는 코드 모듈을 독립적으로 배포 한 경우 현재 상황에 대해 전혀 모르는 클래스 버전을 처리하지 못할 수 있습니다.
나중에 물건을 찢어 버릴 의향이 있지만 과도한 디자인을 피할 수는 있지만 오리가 실제로 사용될 때 오리가 실제로 무엇을하는지 알 필요없이 오리를 사용하는 것을 디자인 할 수있는 매우 강력한 것이 있습니다. 모르는 것은 강력한 것입니다. 오리에 대한 생각을 잠시 멈추고 나머지 코드에 대해 생각할 수 있습니다.
"우리가 할 수 있을까"와 "우리가해야 할까"는 다른 질문입니다. 상속보다 호의적 인 구성은 상속을 사용 하지 않는다고 말하지 않습니다. 상속이 가장 적합한 경우가 여전히 있습니다. 내가 가장 좋아하는 예를 보여 드리겠습니다 .
public class LoginFailure : System.ApplicationException {}
상속을 사용하면 한 줄에보다 구체적이고 설명적인 이름으로 예외를 만들 수 있습니다.
작곡으로 해보십시오. 엉망이 될 것입니다. 또한 상속 체인을 재사용하고 장려 할 데이터 나 방법이 없기 때문에 상속 요요 문제 의 위험 이 없습니다. 이 모든 것이 좋은 이름입니다. 좋은 이름의 가치를 과소 평가하지 마십시오.
Duckbehavior.quackBehavior
코드 의 유형 과 기타 필드 는 무엇입니까 ?