2012-08-24 4 views
3

당신이 추상적 인 클래스 A를 가지고 있다고 가정 해 봅시다. 그렇다면 다른 클래스를 다루는 추상 클래스 B가 있습니다. 단일 책임 원칙

그리고 마지막으로 몇 가지 일반적인 클래스,의는 C 가정 해 봅시다

...

Z.

A와 B 모두 클래스 C .. Z 클래스에서 사용하는 기능을 제공합니다. 필자의 경우 주로 정적 인 관찰자 패턴과 특정 유형의 속성에 대한 __get magic + lazy-loading을 정적으로 사용하지 않습니다. 이 클래스를 하나의 클래스로 병합하려고 생각하지만 SRP를 위반한다고 확신합니다.

따라서 C, D 등에서 A, B를 확장하려고합니다. 기본적으로 모든 C .. Z 클래스는 기능은 B 클래스의 A &입니다. 그래서 그들은 무엇을 해야하는지 외에, 그들은 또한 관찰자 물건 등을합니다.

이것은 단일 책임 원칙을 위반합니까?

답변

3

이것이 특정 사례에 해당되는지는 잘 모르겠지만 대부분의 경우 추상 클래스와 그 구현을 두 개의 일반 클래스로 나눌 수 있습니다. 그들이 상속하지 않기 때문에, 클래스가 덜 밀접하게 결합되어

  • :

    예를 들어

    는 :

    class ThreeAdder { 
        ThreeAdder(IGenericAdder genericAdder) { 
         this.genericAdder = genericAdder; 
        } 
    
        int AddThree(int a) { 
         return this.genericAdder.Add(a, 3); 
        } 
    } 
    
    class NormalAdder implements IGenericAdder { 
        int Add(int a, int b) { 
         return a + b; 
        } 
    } 
    
    var result = new ThreeAdder(new NormalAdder()).AddThree(6); 
    

    이 가지고 여러 가지 장점 :

    abstract class AbstractAdder { 
        int AddThree(int a) { 
         Add(a, 3); 
        } 
    
        abstract int Add(int a, int b); 
    } 
    
    class NormalAdder inherits AbstractAdder { 
        int Add(int a, int b) { 
         return a + b; 
        } 
    } 
    
    var result = new NormalAdder().AddThree(6); 
    

    로 변경 가능 서로에게서. 클래스가 분리되어 있기 때문에 책임은보다 명확하게 구분되고 잘 정의됩니다.

  • 여러 클래스의 기능을 사용할 수 있지만 하나의 추상 클래스에서만 상속 할 수 있습니다. (편집 : 분명히 PHP에서 다중 상속 있기 때문에)
  • 그것은 클래스가 메서드가 호출됩니다 명확하다 (IMHO).

상속을 사용하여 여러 클래스를 연결 한 것처럼 보입니다. 그러나 상속이 의미하는 것은 아닙니다.

3

"다중 상속이 SRP를 위반합니까?"

기술적으로 나는 그렇다고 말하고 싶습니다.

실제로는 더 모호합니다. '책임'이란 무엇입니까? 복합 책임을 달성하기 위해서는 두 가지 기능이 모두 필요합니다. 또한 객체 계층에 부과하는 엄격 성의 구현 및 유지와 관련된 노력의 균형을 맞추어야합니다.

그것은 원칙입니다. 캡슐화와 관심사 분리에 대한 귀하의 생각에 초점을 맞추고 모든 것을 지저분한 모든 수퍼 클래스에 넣으려고하는 것을 막기 위해 존재합니다.

이제 구체적인 예를 살펴 보겠습니다. 편리 성을 위해 A와 B를 사용하고 있습니까? A와 B의 다른 소비자가 필요로하는 것을 살펴보면, 어떤 리팩토링을 시도하고 있습니까 (예 : 필요하지 않거나 다른 곳에서해야하는 기능의 일부 하위 집합). 추상적으로 말하는 것은 불가능합니다.

0

다중 상속은이를 강제하지 않지만이를 유도하는 경향이 있습니다.기본 인터페이스는 단일 목적을 위해 설계되었으며, 둘 다 상속하면 여러 책임이있는 클래스가 작성됩니다. 클래스와 인터페이스를 시스템의 필수 복잡성을 다루는 두 가지 주요 그룹과 우발적 인 복잡성을 해결하는 그룹으로 나눌 수 있습니다. 나는 당신이 하나 이상의 "필수"수업을 상속 받았다면 그것은 나쁘다고 생각합니다. 그러나 하나의 "필수"클래스와 하나 이상의 "우발적 인"클래스를 상속받는 경우에는 정상입니다.

관련 문제