单一职责原则

3
假设你有一个抽象类A在做一些事情。然后你有另一个抽象类B在做其他的事情。
最后还有几个普通类,比如C ... Z。
A和B都提供了被C...Z类使用的功能。在我的情况下,主要是观察者模式(静态)和某种类型属性的__get魔术方法+延迟加载 - 这不是静态的。我想将其合并为一个类,但我确定这违反了SRP :)
因此,我在C、D等类中扩展了A、B...实际上,所有C...Z类都继承了A和B类的功能。所以除了它们应该做的事情外,它们还会执行观察者相关的操作等。
这是否违反了单一责任原则?
3个回答

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中不行,因为您可以多重继承)
  • 更清晰(在我看来)哪个类调用了该方法。
看起来你正在使用继承来耦合多个类,但这不是继承的本意。

3

我理解为“多重继承是否违反单一职责原则(SRP)”?从技术上讲,我的回答是肯定的。实际上,这更加模糊。什么是“职责”?为了满足组合职责,可能需要同时拥有两个功能部分。您还需要平衡所施加的对象层次结构严格性的实现和维护所需的努力。这是一个原则。它存在的目的是围绕封装和关注点分离来集中您的思考,以避免试图将所有内容都放入混乱的全能超类中。

现在看具体例子:您是为了方便而使用A和B吗?如果查看A和B的不同使用者需要什么,是否有一些重构试图打破(例如一些不需要的功能子集或应该在其他地方完成的功能)?在抽象层面上,无法确定。


0

多重继承并不强制要求这样做,但往往会导致这种情况。您的基础接口是为单一目的而设计的,继承它们两个会创建一个具有多个职责的类。 您可以将类和接口分成两个主要组 - 一个组用于解决系统的本质复杂性,另一个组用于解决其偶然复杂性。我认为如果您从多个“本质”类继承,那么这是不好的。但是,如果您从一个“本质”类和一个或多个“偶然”类继承,则是正常的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接