15 | 面向对象之继承:继承是代码复用的合理方式吗?
- 深入了解
- 翻译
- 解释
- 总结
继承作为面向对象编程的重要特点之一,一直被广泛应用于代码复用。然而,本文提出了对继承的不同视角和思考方式。作者首先介绍了实现继承和接口继承两种继承方式,强调了实现继承并不是一种值得鼓励的做法。文章通过示例分析了不同编程语言中的代码复用方式,包括Java的继承、Ruby的mixin机制、Scala的trait以及C++的私有继承。作者指出,组合优于继承,并提倡面向组合编程的思路。通过分解关注点,将类设计为多个小模块的组合,实现了更灵活的代码复用和更清晰的设计结构。最后,文章强调了面向对象编程的核心是面向对象而不是类,强调了对象的独立性和操作性。 本文通过对继承的不同视角和编程方式的探讨,引发了对代码复用和设计结构的深入思考,为读者提供了新的编程思路和设计理念。文章内容丰富,涵盖了多种编程语言的特性和实践经验,对于理解面向对象编程的本质和提升编程技能具有重要的指导意义。文章最后提出了思考题,鼓励读者了解一种名为DCI的编程思想,以拓展对代码设计的理解。 总的来说,本文通过对继承和代码复用方式的深入剖析,为读者提供了新的编程思路和设计理念,对于提升编程技能具有重要的指导意义。
《软件设计之美》,新⼈⾸单¥59
全部留言(22)
- 最新
- 精选
- Being老师,我有个概念上的疑惑,分离的关注点是一个个独立的模块,然后由一个个小模块组合出类,这个类就指的是“大对象”吗? 上面的一个个小模块,其实也是类,只不过是小类,对于C++就是class的实现手法,Ruby可以是module的实现手法,是这样的吗? DCI关注的是数据在context中的交互行为,我的理解大概就是数据在不同的context,扮演不同的角色,这些角色的属性,是数据内组合上下文需要的特性实现的。
作者回复: 你的理解是对的,因为在 Java/C++这类语言中只有类这一个概念,所以,我们不得不用类表示所有的东西,之所以,要讲不同语言的做法,就是希望大家知道,自己写代码时,这个“类”扮演了什么角色。
2020-06-309 - 布凡DCI是对象的Data数据, 对象使用的Context场景, 对象的Interaction交互行为三者简称, DCI是一种特别关注行为的模式(可以对应GoF行为模式),而MVC模式是一种结构性模式,DCI可以使用演员场景表演来解释,某个实体在某个场景中扮演包公,实施包公升堂行为;典型事例是银行帐户转帐,转帐这个行为按照DDD很难划分到帐号对象中,它是跨两个帐号实例之间的行为,我们可以看成是帐号这个实体(PPT,见四色原型)在转帐这个场景,实施了钞票划转行为,这种新的角度更加贴近需求和自然,结合四色原型 DDD和DCI可以一步到位将需求更快地分解落实为可运行的代码,是国际上软件领域的一场革命。 摘自 https://www.jdon.com/dci.html
作者回复: 很好的补充。
2020-07-3028 - 奕组合优于继承,可以使用继承的地方几乎都可以用组合替换的,那是不是说继承这个特性在现代编程语言中没有什么作用了(接口继承实力上就是多态)
作者回复: 先看看现代程序设计语言的设计,比如,Go和Rust。
2020-07-045 - sam所谓组合就是类的引用吧,面向对象编程时,如果不是继承关系,那大概率就是引用类来实现功能的组合吧
作者回复: Java 的类引用可以表达很多概念,属性和组合都是通过同样的概念表示出来的。好处就是简单,坏处就不清楚。
2020-06-2925 - lanlyhs这个高手的这一系列文章,我在刚入行的时候拜读过,看的云里雾里。上面这一篇文章「小类,大对象 」目前打不开了,我在 web.archive.org 中找到了一个历史,分享给大家, https://web.archive.org/web/20200813165817if_/https://www.jianshu.com/p/a830d2261392
作者回复: 多谢分享
2021-08-234 - Geek_0315ca做设计最难的两点:1.是作抽象(找共性,文档中的系统模型,代码详细设计的接口);2是作分解(找特性,实现)。分解的目的就是将处理逻辑和数据的不同点突出出来,根据不同的差异将各种实现进行相应的组合,支持接口功能。分解做好了,代码重复性就降低了。关于分解可以从两个方面着手:1.数据角度;2.数据处理角度。至于这两个角度如何去在开发中落实,我目前还没有行成具体的解决模式,跟着课程继续往下走,看看有什么启发吧。
作者回复: 这个总结的角度很好。
2021-01-284 - 码农Kevin亮请问老师,组合我是理解的了。但文中提到的“小类大对象”中的大对象为什么强调是对象呢?为什么不是大类呢?还有说到这里时,又强调了面向对象而不是面向类,这又怎么理解其中在设计思想上的差异呢?
作者回复: 这里的小类大对象是用 C++的方式描述的,每个类是小的,简言之代码都不多,最终形成的对象是个大的,因为它把所有的小类组合了起来。在运行时,用到的是对象,而设计中,你用到的是接口,是类层面的东西。
2020-07-154 - Janenesome看到老师的回复:Java 的类引用可以表达很多概念,属性和组合都是通过同样的概念表示出来的。好处就是简单,坏处就不清楚。 请问老师,属性和组合有什么区别呢,后面的文章中会有提到吗
作者回复: 属性就是一个类固有的性质,就像一个人的身高体重;组合讲的是与其它部分的关系,比如,车有两个轮胎。
2020-10-2023 - Reason关于dci可参阅的代码案例太少了。了解起来找不到门。。
作者回复: 是否能够快速学习一个新东西,就是程序员之间体现出差异的地方。
2020-07-013 - 阳仔继承是面向对象的基本原则之一,但在编码实践中能用组合来实现尽量使用组合。 DCI也是一种编码规范,它是对面向对象编程的一种补充,其实核心思想也是关注点分离
作者回复: 很好的理解!
2020-06-293