상속보다 구성

3948 단어
나는 당신과 함께 우리의 코드베이스를 구성하고 정리하고 확장 가능하고 유지 관리할 수 있도록 만드는 데 도움이 되는 몇 가지 디자인 원칙을 설명하기 위해 여행을 떠날 것입니다. 코드를 더 깨끗하고 재사용 가능하게 만드는 중요한 개념에 대해 살펴보겠습니다.
구성은 무엇이며 언제 사용해야합니까?
예를 들어 이 질문에 대해 설명하고 답하겠습니다. 우리 모두는 예를 좋아합니다 :)
Duck이라는 수퍼 클래스가 있다고 상상해보십시오.

class Duck 
{
    public function fly(){}
    public function quack(){}
    public function display(){}
}


이 클래스에는 3개의 일반적인 메서드가 있으며 현재로서는 유용하며 고객이 RubberDuck이라는 새로운 유형의 오리를 추가하도록 요청할 때까지 우리에게 잘 작동합니다. 여기서 문제를 알 수 있습니까?
문제를 보자

class RubberDuck extends Duck
{
    public function fly(){} // Why implement this method ?!
    public function quack(){} // also why too ?!
    public function display(){}
}


부모 Duck 클래스에서 확장하면 Rubber Duck에 쓸모없는 fly() 및 Quack()라는 메서드를 상속받게 되므로 해결책은 무엇입니까? 대답은 Duck 클래스 외부에서 fly 및 Quack 메서드를 꺼내고 FlyableInterface 및 QuackablInterface와 같은 새 인터페이스를 만드는 것입니다. 예를 들어 FlyableInterfance에서 fly()라는 메서드가 있고 QuackablInterface에서 quack이라는 메서드가 있습니다. 그런 다음 Duck 클래스에서 구현할 수 있습니다. 기능을 기반으로 이러한 인터페이스 방법
따라서 코드는 다음과 같이 리팩터링됩니다.

Interface Flyable
{
    public function fly();
}
Interface Quack
{
    public function quack();
}


이제 새 버전의 RubberDuck 클래스는 새 인터페이스 메서드를 구현합니다.

class RubberDuck implements FlyableInterface, QuackableInterface 
{
    public function fly(){} // from interface
    public function quack(){} // from interface
    public function display(){}
}


Duck 클래스에는 display()라는 모든 유형에 공통적으로 사용되는 하나의 메서드가 있습니다.

class Duck
{
    public function display(){}
}


그래서 여기서 우리는 부분적으로 문제를 해결하지만 이 업데이트 이후에도 몇 가지 문제를 발견할 수 있지만 다른 문서에서 논의하거나 문제에 대한 의견을 작성해 봅시다.
따라서 위의 예에서 클래스 외부의 일부 메서드를 꺼내고 해당 클래스가 슈퍼 클래스의 모든 메서드가 아닌 적절한 인터페이스 메서드를 구현할 수 있도록 인터페이스를 만드는 프로세스라고 구성의 의미를 요약할 수 있습니다.
간단한 방법으로도 아이디어를 명확히 하는 데 성공했으면 합니다.
읽어주셔서 감사합니다. 제 영어가 제 모국어가 아니어서 죄송합니다.

좋은 웹페이지 즐겨찾기