单一责任原则

时间:2012-08-24 12:51:13

标签: php class single-responsibility-principle

假设您有抽象的A类做某些事情。然后你有抽象的B级做其他事情。

最后是一些正常的课程,比方说C ...... Z。

A和B都提供C类...... Z类使用的功能。在我的例子中,主要是一个静态的观察者模式,以及某种类型的属性的一些__get魔术+延迟加载 - 这不是静态的。我想把它合并成一个类,但是我确定它违反了SRP:)

所以我在C,D等中扩展A,B ......基本上所有C .. Z类都继承了A& A的功能。 B班。除了他们应该做的事情之外,他们还会做观察者的事情等等

这是否违反了单一责任原则?

3 个答案:

答案 0 :(得分:3)

我读到这个“多重继承是否违反了SRP”?

从技术上讲,我会说是。

实际上,它更模糊。什么是“责任”?您可能需要两部分功能来满足复合责任。您还必须平衡与实施和维护对象层次结构严格性相关的工作量。

这是一个原则。它的存在是为了集中思考封装和分离关注点,以避免将所有内容都抛到凌乱的“一刀切”的超类中。

现在举一个具体的例子:你是否为了方便而拉入A和B?如果你看看A和B的不同消费者需要什么,是否有一些重构试图突破(例如某些不需要或应该在其他地方完成的功能子集?)在摘要中,这是不可能的。

答案 1 :(得分:3)

我不知道这是否适用于您的具体案例,但我发现大部分时间,抽象类及其实现可以分为两个普通类。

例如:

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);

可以改为:

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);

这有几个好处:

  • 这些课程的联系不那么紧密,因为他们不会相互继承。因为这些类是分开的,所以责任更加独立且定义明确。
  • 您可以使用多个类的功能,而只能从一个抽象类继承。 (编辑:显然不在PHP中因为你有多重继承)
  • 关于调用该方法的类更清楚(恕我直言)。

看起来你正在使用继承来连接多个类,但这不是继承的意思。

答案 2 :(得分:0)

多重继承不会强迫这一点,但往往导致它。您的基本接口是为单一目的而设计的,继承这两个接口确实创建了一个具有多个职责的类。 您可以将类和接口划分为两个主要组 - 解决系统基本复杂性的组,以及解决其意外复杂性的组。我想如果你继承了多个"必要的"上课,很糟糕。但如果你继承了一个"必要的"和一个或多个"意外"上课,这是正常的。