첫째, 순전히 추상 클래스는 실제로 여러 상속을 수행 할 수없는 인터페이스라는 것을 이해하십시오.
쓰기 클래스, 추출 인터페이스는 두뇌 활동입니다. 우리는 리팩토링을 할 수 있습니다. 동정입니다. 이 "모든 클래스는 인터페이스를 얻는다"패턴을 따르면 혼란을 야기 할뿐만 아니라 요점을 완전히 놓친다.
인터페이스는 단순히 클래스가 할 수있는 모든 것을 공식적으로 설명하는 것으로 생각해서는 안됩니다. 인터페이스는 필요한 클라이언트 코드를 사용하여 부과 된 계약으로 간주해야합니다.
현재 하나의 클래스 만 구현하는 인터페이스를 작성하는 데 전혀 문제가 없습니다. 실제로 클래스가 아직 구현하지 않은 경우 실제로 상관하지 않습니다. 사용하는 코드에 무엇이 필요한지 생각하기 때문입니다. 인터페이스는 사용 코드가 요구하는 것을 표현합니다. 나중에 오는 것은 이러한 기대를 만족하는 한 좋아하는 것을 할 수 있습니다.
한 객체가 다른 객체를 사용할 때마다이 작업을 수행하지 않습니다. 경계를 넘을 때이 작업을 수행합니다. 하나의 물체가 어떤 다른 물체와 대화하고 있는지 정확히 알고 싶지 않을 때 수행합니다. 다형성이 작동하는 유일한 방법입니다. 클라이언트 코드가 말하는 객체가 변경 될 것으로 예상되면 그렇게합니다. 내가 사용하는 것이 String 클래스 일 때 확실히하지 않습니다. String 클래스는 훌륭하고 안정적이며 변경되는 것을 막을 필요가 없습니다.
추상화 대신 구체적인 구현과 직접 상호 작용하기로 결정하면 구현이 변경되지 않을 것으로 믿을만큼 충분히 안정적임을 예측할 수 있습니다.
바로 의존성 역전 원칙을 강화하는 방법이 있습니다. 맹목적으로 이것을 모든 것에 적용해서는 안됩니다. 추상화를 추가하면 실제로 프로젝트 수명 동안 안정적으로 클래스를 구현하는 선택을 신뢰하지 않는다고 말하는 것입니다.
이것은 모두 공개 폐쇄 원칙 을 따르려고한다고 가정합니다 . 이 원칙은 확립 된 코드를 직접 변경하는 것과 관련된 비용이 상당 할 경우에만 중요합니다. 사람들이 객체를 분리하는 것이 얼마나 중요한지에 동의하지 않는 주된 이유 중 하나는 직접적인 변경을 할 때 모든 사람이 동일한 비용을 경험하지 않기 때문입니다. 전체 코드베이스를 다시 테스트, 재 컴파일 및 재배포하는 것이 쉽지 않은 경우 직접 수정하여 변경해야 할 필요성을 해결하는 것이이 문제를 매우 매력적으로 단순화 할 수 있습니다.
이 질문에 대한 간단한 답변은 없습니다. 인터페이스 또는 추상 클래스는 모든 클래스에 추가해야하는 것이 아니며 구현 클래스 수를 세어 필요하지 않다고 결정할 수는 없습니다. 변화를 다루는 것입니다. 미래를 예상한다는 의미입니다. 잘못 이해해도 놀라지 마십시오. 구석에 자신을 백업하지 않고 최대한 간단하게 유지하십시오.
코드를 읽는 데 도움이되는 추상화를 작성하지 마십시오. 이를위한 도구가 있습니다. 디커플링이 필요한 것을 분리하려면 추상화를 사용하십시오.