代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

单一责任和混合

  •  6
  • Mongus Pong  · 技术社区  · 15 年前

    鉴于 Mixins 通常将新行为引入类中,这通常意味着类将具有多个行为。

    如果一个类有一个单一的责任,则定义为只有一个变更原因的类。

    所以,我可以从两个不同的角度看这个问题

    1. 该类只有一个更改原因。混入的模块也只有一个更改原因。如果班级发生变化,只有班级需要重新测试。如果只更换模块,则需要重新测试模块。因此,SRP是完整的。

    2. 这个班现在有两个改变的原因。如果更改了类,则类和模块都需要重新测试。如果更换了模块,则需要重新测试类和模块。亨格,SRP被侵犯了。

    使用mixin是否违反 Single Responsibility Principle 最终导致更难维护的系统?

    4 回复  |  直到 15 年前
        1
  •  1
  •   user395760    15 年前

    当您需要在不相关的类之间共享行为时(有时您需要这样做),基本上有三种选择:

    1. 复制粘贴到任何地方。这违反了干燥,保证了维护性。
    2. 把它放到一个抽象类中,让您的所有类(其中许多类彼此不相关)继承它。这通常被认为是OO反模式。简单地说,它完全颠覆了继承的概念。只是因为Foo和Bar做了一些同样的事情,你不会声称 FO IS-A棒 .
    3. 把它放在其他地方,给它一个明确的名字,然后把它混合到所有需要它的类中。

    至于测试,我认为一个“好的”混合,就像一个好的常规方法一样,应该松散地耦合到足以使它和使用它的类可以独立地使用。

        2
  •  1
  •   Grant Crofton    15 年前

    我想这取决于混音器。它可能会给它额外的责任,但是有一些 Ruby's Comparable 它提供了非常低级的功能,我认为这不会违反SRP。

        3
  •  1
  •   soru    15 年前

    考虑到mixin通常将新行为引入类中,这通常意味着类将具有多个行为。

    如果这是真的,那么对于单个(实现)继承来说也是一样的。虽然没有人再喜欢23个深度继承层次,但它仍然有它的位置。

    继承没有破坏SRP的原因是它所说的类是一个文本代码文件意义上的类,而不是更抽象的类。如果更改基类代码文件,则通常不需要更改该文件。

    所以改变它的唯一原因是被保留下来的。

        4
  •  -1
  •   Matthew Groves    15 年前

    我同意这一点。但是,可以(或应该)违反SRP 有时 .

    推荐文章