继承与可测试性的组合

Par*_*rag 26 inheritance testability composition

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

我想知道其他人是否也发现这是喜欢作曲的理由.还有什么其他可测试性陷阱,因为使用了继承?

The*_*TXI 31

我相信你越是开始使用设计模式开发,你会越来越多地发现组合比继承更受青睐.我实际上相信Head First:Design Patterns一书中的"赞成组合而不是继承 "是主要的设计原则之一.

您可以模拟部分组合进行测试的示例可能是最好的示例之一.

编辑:虽然设计模式的基本原则是支持组合而不是继承,但这并不意味着没有设计模式在需要的地方使用继承.另一个基本的例子是装饰器模式,你正在编写一个抽象的超类(虽然这是用于类型匹配而不是用于实现"is-a"关系).

  • 嗯...希望我知道为什么有人投了这票.如果我知道某个特定原因,我可以尝试澄清或修改. (3认同)

S.L*_*ott 10

这不是一种或两种情况.他们不是竞争对手.

继承也很容易进行单元测试.但是,它有时需要模拟具体类来测试抽象超类.

继承很容易被不正确地使用.有些设计看起来像"is-a"情况,但实际上并非如此 - 它们更加细致入微.有时它真的是"表现得像",你需要某种组合(例如策略)来将行为与其他属性分开.


Lou*_*nco 8

Gang of Four Design Patterns一书基本上都是关于为什么更喜欢组合而不是继承,并提供了许多方法来做到这一点.一些原因:

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

  2. 在许多较新的语言中,继承仅限于一个类,而您可以根据需要进行组合
  3. 基类不能在运行时更改(基本上是您遇到的问题).

  • 课程的数量与此有什么关系?组合是否意味着比继承更少的类? (2认同)

Lar*_*ken 5

我认为组合更容易测试的最大原因是(实现)继承往往会创建非常脆弱(脆弱的基类)并且更难以单独测试的非常耦合的类.

继承肯定有它的用途,但我发现自己越来越喜欢组合而不是继承.