代码之家  ›  专栏  ›  技术社区  ›  Parag

可测试性的继承与组合

  •  25
  • Parag  · 技术社区  · 16 年前

    在设计对象时,我发现从可测试性的角度来看,组合是更好的选择。原因是,如果需要的话,我可以在运行单元测试时模拟组成结构的各个部分。如果我有继承层次结构,这是不可能的。

    我想知道其他人是否也认为这是喜欢写作的原因。另外,由于使用了继承,您还遇到了什么其他可测试性陷阱?

    5 回复  |  直到 9 年前
        1
  •  30
  •   TheTXI    16 年前

    我相信,使用设计模式开发的越多,您会越来越频繁地发现组合将比继承更受欢迎。我真的相信 头部优先:设计模式 书中写道: 有利于组合而非继承 “是主要设计原则之一。

    您能够模拟组成部分进行测试的示例可能是最好的示例之一。

    编辑 :尽管设计模式的基本原则是赞成组合而不是继承,但这并不意味着没有设计模式在需要继承的地方使用继承。另一个基本的例子是decorator模式,您在这里编码一个抽象的超类(尽管这是为了类型匹配,而不是为了实现一个“is-a”关系)。

        2
  •  10
  •   S.Lott    16 年前

    这不是一个非此即彼的局面。他们不是竞争对手。

    继承也相当容易进行单元测试。然而,有时需要模拟具体类来测试抽象超类。

    继承很容易被不当使用。有些设计看起来像是“IS-A”情况,但实际上并不是——它们更细微。有时它真的“表现得像”你需要某种组合(A 策略 例如)将行为与其他属性分开。

        3
  •  8
  •   Lou Franco    16 年前

    四人帮 Design Patterns 这本书基本上都是关于为什么喜欢构图而不是继承,并提供了很多方法来做到这一点。原因有:

    1. 类的数量增加了代码库的复杂性

    2. 在许多较新的语言中,继承仅限于一个类,而您可以随意组合。
    3. 不能在运行时更改基类(本质上是运行时遇到的问题)。
        4
  •  5
  •   Lars A. Brekken    16 年前

    我认为组合更容易测试的最大原因是(实现)继承倾向于创建非常耦合的类,这些类更脆弱(脆弱的基类)并且更难单独测试。

    继承当然有它的用途,但我发现自己越来越喜欢组合而不是继承。

        5
  •  3
  •   topchef    16 年前

    “优先使用对象组合而不是类继承” 实际上是从Gof的书。这个 conversation 埃里希·伽玛在书中描述了这个想法。

    需要继承的一个重要模式是模板方法模式。这种模式被广泛使用非常方便,所以继承就留在这里。另一个使用继承的常见模式是复合模式。我试图说明的一点是,根本不考虑继承,但我希望从任何角度看这么多常见的API都能清楚…