9

希望高手能解惑。非常高的概述是我不是编码的初学者,但对 OOP 还是新手。这组消息类是我们正在编写的一个大型模拟应用程序的核心,我不想愚蠢地这样做——这个接口将应用程序切成两半,从定序器到执行器,反之亦然。

我的问题是拥有这么深的继承层次结构是否是一个坏主意(图像尚未充实,最终可能会达到 5 或 6 深)。这与让某些子类与其父类直接关联而不是继承相反。

我读过深继承层次结构不是一个好主意,如果子类继承只是为了拥有父级的数据,那么您应该简单地将父级作为数据包含在子级中,但我很难时间围绕为什么。如果我决定将继承层次结构设为 7 深或类似的东西,将会发生什么坏事?显然,性能受到了一点影响,并且在层次结构的顶部进行更改会在整个应用程序中产生巨大的影响,但除此之外我没有看到任何问题。除此之外,我不太关心性能上的细微差别。

类层次结构

(额外的问题:是否有现成的包可以处理这类东西?我们处理了大部分低级物理模拟,但我们将不得不编写排序程序。我只是怀疑我所列出的内容与我之前大约 10,000 名模拟开发人员所做的非常相似。)

(奖励问题 #2:任何同时掌握模拟系统和 OOP 编程的大师,都不会讨厌住在洛杉矶?我们正在招聘。)

4

3 回答 3

11

如果一个子类只是为了拥有父类的数据而继承

这是一个坏主意。有这样的理解,您将基类定义为一组(具体)类将遵守的最通用的合同。这通常意味着您的合同是关于行为而不是实施的。

如果我决定将继承层次结构设为 7 深或类似的东西,将会发生什么坏事?

这里的主要问题是平凡的:

  • 脆弱的基类(对基类的更改对于派生类来说是一场噩梦)
  • 耦合增加(基类过多会导致紧耦合)
  • 封装减弱
  • 测试问题(由于这里和那里的多个链接调用,不能仅仅测试叶级覆盖方法以始终正确地重现最终用户行为)
  • 维护(来自强耦合)

(你们很多人都想仔细阅读这篇关于为什么 Ada 不受欢迎的论文,特别是第 6 条第 6 段。)

是否有现成的包可以处理这种东西?

我不确定您在寻找什么,但如果您正在寻找自动层次结构简化器,那么我不知道。此外,如果存在这样的包,它将高度依赖于您选择的语言,而您还没有提及。

请注意,大多数情况下,此类问题可以通过查看聚合或特征或依赖注入等替代方案来解决。这些是设计时问题,通常(IMO)最好在白板上解决,而不是使用编译器和数百万个 LOC。

于 2012-06-15T19:37:15.607 回答
5

很晚才看到这个问题,但是我对此有很多想法,并且被深深的继承层次所咬。它们不好的一个原因是,当您专门处理许多子类时,您将不可避免地弄错分类。但是,一旦有了类结构,就很难更改,因为这样做会破坏客户端代码。

我在这里写了一篇博客。

于 2015-04-21T04:20:45.830 回答
0

老问题,但软件开发中的活跃问题,想添加一个可能有帮助的意见。

当您使用 DI 接触基类时,无法估计维护开销。这是最近影响我们的 3 级深度继承结构的一个主要缺点。此外,如果您的基础是一个模板,例如,如果您有太多的孩子,而在 3 个级别中只有 1 个派生父级,则预计会违反 SOL(I)(D)。

通常,只是为了访问数据,如果不违反 SOLID,我会选择适当的设计模式或传递数据指针。根据您是阅读还是写作,我也会避免使用 getter 和 setter 来避免Quasi-Classes。默认子级受到“保护”的情况很少见,我认为这种情况下的结构可能存在设计缺陷。

于 2021-10-04T09:19:51.560 回答