网易首页 > 网易号 > 正文 申请入驻

继承是代码复用的最佳方案吗?

0
分享至

推荐大家关注一个公众号

点击上方 "JavaEdge"关注, 星标或置顶一起成长

后台回复“面试”有惊喜礼包!

这是一个纷杂而无规则的世界,越想忘掉的事情,越难忘记。

正文

继承是代码复用的最佳方案吗?

继承,一个父类可有许多个子类。父类就是把一些公共代码放进去,之后在实现其他子类时,少写一些代码。

代码复用,很多人觉得继承就是绝佳方案。若把继承理解成代码复用,更多是站在子类角度向上看。在客户端代码使用时,面对的是子类,这种继承叫实现继承:

Child object = new Child();

还有一种看待继承的角度:从父类往下看,客户端使用时,面对的是父类,这种继承叫接口继承:

Parent object = new Child();

但接口继承更多和多态相关。本文主要讨论实现继承。

不推荐实现继承

  • • 继承很宝贵,Java只支持单继承 一个类只能有一个父类,一旦继承的位置被实现继承占据,再想做接口继承就难了

  • • 实现继承通常也是一种受程序设计语言局限的思维方式 很多语言,不使用继承,也有代码复用方案

1 案例

产品报表服务,其中的某服务:查询产品信息。该查询过程通用,别的服务也可用。所以,我把它放父类以复用:

class BaseService {
// 获取相应产品信息
protected List getProducts(List product) {

// 生成报表服务
class ReportService extends BaseService {
public void report() {
List product = getProduct(...);
// 生成报表
...
}
}

ReportService没有继承任何类,但也可复用代码,即ProductFetcher模块。这样,若我需要有个获取产品信息的地方,它不必非得是个服务,我无需继承任何类。

获取产品信息、生成报表是两件事,只是因为在生成报表过程,需要获取产品信息,所以,它有个基类。

不用继承的实现:

class ProductFetcher {
// 获取相应的产品信息
public List getProducts(List product) {

// 生成报表服务
class ReportService {

private ProductFetcher fetcher;

public void report() {
List product = fetcher.getProducts(...);
// 生成报表
...
}
}

这就是组合:ReportService里组合一个ProductFetcher。设计通用原则:组合优于继承。即若一个方案既能用组合实现,也能用继承实现,那就用组合。

所以,要写继承以实现代码复用时,问问自己,这是接口继承,还是实现继承?若是实现继承,是不是可以写成组合?

2 面向组合编程

可以组合的根因:获取产品信息、生成报表服务本是两件事(分离关注点)。你要是看出是两件事了,就不会把它们放一起。

分解是设计的第一步,分解粒度越小越好。当可分解出多个关注点,每个关注点就是个独立类。最终类由这一个个小类组合而得,即面向组合编程。按面向组合思维:为增加复杂度,增加一个报表生成器(ReportGenerator),在获取产品信息后,生成报表:

class ReportService {

private ProductFetcher fetcher;

private ReportGenerator generator;

public void report() {
List product = fetcher.getProducts(...);
// 生成报表
generator.generate(product);
}
}

OOP面向的是“对象”,不是类!很多程序员习惯把对象理解成类的附属品,但在Alan Kay的理解中,对象本身就是独立个体。所以,有些语言支持直接在对象操作。

现在,想给报表服务新增接口:处理产品信息。这样的处理只会影响这里的一个对象,而同样是这个ReportService的其他实例,则完全不受影响。

  • • 好处 不必写那么多类,根据需要,在程序运行时组合出不同对象。

Java只有类这种组织方式,所以,很多有差异的概念只能用类这一个概念表示,思维受到限制,不同语言则提供不同的表现形式,让概念更加清晰。

前面只是面向组合编程在思考方式的转变,现在看设计差异。

3 案例

字体类(Font)需求:支持加粗、下划线、斜体(Italic),且能任意组合。

3.1 继承

需8个类:

字体类(Font)只需三个独立维度:是否加粗、下划线、斜体。若再来一种需求,变成4种,采用继承,类数量膨胀到16个,而组合只需再增加一个维度。把一个M*N问题,设计转成M+N。

Java在面向组合编程方面能力较弱,但Java在尝试不同方案。早期尝试有Qi4j,后来Java 8加入default method,在一定程度上也可支持面向组合编程。

4 DCI

继承是OOP原则之一,但编码实践中能用组合尽量使用组合。DCI也是一种编码规范,对OOP的一种补充,核心思想也是关注点分离。

DCI是对象的Data数据, 对象使用的Context场景, 对象的Interaction交互行为三者简称, 是一种特别关注行为的模式(可对应GoF行为模式),而MVC模式是一种结构性模式,DCI可使用演员场景表演来解释,某实体在某场景中扮演包公,实施包公升堂行为;典型事例是银行帐户转帐,转帐这行为按DDD很难划分到帐号对象,它是跨两个帐号实例之间的行为,可看成是帐号这个实体(PPT,见四色原型)在转帐这个场景,实施了钞票划转行为,这种新角度更贴近需求和自然,结合四色原型 DDD和DCI可以一步到位将需求更快地分解落实为可运行的代码,是国际上软件领域的一场革命。摘自 https://www.jdon.com/dci.html

5 总结

组合优于继承。复用方式背后的编程思想:面向组合编程。它给我们提供了一个不同的视角,但支撑面向组合编程的是分离关注点。将不同关注点分离,每个关注点成为一个模块,在需要时组装。面向组合编程,在设计本身上有很多优秀地方,可降低程序复杂度,更是思维转变。

参考 • https://www.infoq.cn/article/2007/11/qi4j-intro • https://en.wikipedia.org/wiki/Data,_context_and_interaction

欢迎加入后端 ,关注本公众号添加我本人微信,邀请进群 。

最近在准备面试BAT,特地整理了一份面试资料,覆盖Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全的互联网大厂Java面试经验总结。

想获取史上最简单的Java大厂面试题学习资料

关注如下公众号,后台回复「面试」即可白嫖!

嘿,你在看吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“一丝不挂”新舞蹈?惹争议,被摸下体更不害臊,金星质疑是对的

“一丝不挂”新舞蹈?惹争议,被摸下体更不害臊,金星质疑是对的

吃鱼思故渊
2024-05-16 21:48:21
权志龙香港参加活动变“权志凤”,打扮得像韩国那些菜市场大妈

权志龙香港参加活动变“权志凤”,打扮得像韩国那些菜市场大妈

圈里的甜橙子
2024-11-04 18:31:44
韩国总统尹锡悦作恶太多!给韩国人免签,但不让他飞越我们领空

韩国总统尹锡悦作恶太多!给韩国人免签,但不让他飞越我们领空

橘色数码
2024-11-04 12:15:19
开始找退路了?大选最后阶段,特朗普罕见发声:我猜可能会输!

开始找退路了?大选最后阶段,特朗普罕见发声:我猜可能会输!

看晓天下事
2024-11-04 15:09:33
男子未扶摔倒老人,遭家属上门索赔:你就是故意不付的,你必须赔

男子未扶摔倒老人,遭家属上门索赔:你就是故意不付的,你必须赔

大川哥
2024-11-03 20:40:46
曝1亿锋霸无意加盟曼联!红魔太乱,阿莫林不足以说服其挑战黑洞

曝1亿锋霸无意加盟曼联!红魔太乱,阿莫林不足以说服其挑战黑洞

罗米的曼联博客
2024-11-05 07:18:15
一个人可以厉害到什么程度?网友:父辈几代都被打过,还不敢还手

一个人可以厉害到什么程度?网友:父辈几代都被打过,还不敢还手

奇特短尾矮袋鼠
2024-11-04 13:37:14
从中国独立出去的5个国家,如今发展得怎样?有些国家后悔莫及

从中国独立出去的5个国家,如今发展得怎样?有些国家后悔莫及

谢小龙聊历史
2024-11-04 23:31:07
不懂个人资产的黄圣依,转身去读商学院,张泉灵的打抱不平好尴尬

不懂个人资产的黄圣依,转身去读商学院,张泉灵的打抱不平好尴尬

米椒娱乐
2024-11-04 10:12:22
“退出北约!绝不与俄为敌!”——这句话引发的国际巨震!

“退出北约!绝不与俄为敌!”——这句话引发的国际巨震!

星辰故事屋
2024-10-13 20:00:22
笑发财,大家消费都降级到了什么程度,网友的辣评直接笑死!

笑发财,大家消费都降级到了什么程度,网友的辣评直接笑死!

奇特短尾矮袋鼠
2024-11-05 09:48:10
安124飞抵珠海,机舱内带了一架苏57

安124飞抵珠海,机舱内带了一架苏57

三叔的装备空间
2024-11-04 14:56:23
家长群不雅视频后续!女方照片被扒,眼神很勾人,电话被打爆

家长群不雅视频后续!女方照片被扒,眼神很勾人,电话被打爆

魔都姐姐杂谈
2024-09-15 10:31:28
苏57抵华,意外曝光歼20一大底牌,连美空军都办不到

苏57抵华,意外曝光歼20一大底牌,连美空军都办不到

兵器展望
2024-11-04 19:39:53
前脚炸烂真主党,后脚千里奔袭胡塞,看以色列打出个新世界

前脚炸烂真主党,后脚千里奔袭胡塞,看以色列打出个新世界

近距离
2024-09-30 10:02:10
张艺谋力捧的女星,与富豪卷款61亿逃亡国外,永不回国!现在如何

张艺谋力捧的女星,与富豪卷款61亿逃亡国外,永不回国!现在如何

火之文
2024-11-04 17:37:16
最后24小时,哈里斯宣布将会获胜,手握3大优势,自信能入主白宫

最后24小时,哈里斯宣布将会获胜,手握3大优势,自信能入主白宫

影孖看世界
2024-11-04 23:35:15
杨议怒怼郭德纲三宗罪,称要为曹云金撑腰,侯耀华也来凑热闹

杨议怒怼郭德纲三宗罪,称要为曹云金撑腰,侯耀华也来凑热闹

小海娱计
2024-11-04 16:58:46
满分答案来了!全网老公都被一盒瑞士卷干沉默了,网友:还得是你

满分答案来了!全网老公都被一盒瑞士卷干沉默了,网友:还得是你

童童聊娱乐啊
2024-11-03 23:07:38
90年我当兽医,我赶公猪给寡妇家的母猪配种没配上,被她强留一周

90年我当兽医,我赶公猪给寡妇家的母猪配种没配上,被她强留一周

燕无衣
2024-09-06 08:10:05
2024-11-05 10:38:44
JavaEdge
JavaEdge
Java 技术
369文章数 448关注度
往期回顾 全部

科技要闻

硅谷2024最疯狂投资:押注下一任美国总统

头条要闻

女子失联12天没吃没喝在通风井获救 濒死之际出现幻觉

头条要闻

女子失联12天没吃没喝在通风井获救 濒死之际出现幻觉

体育要闻

一个想改变中国足球的日本人

娱乐要闻

UP主影视飓风Tim官宣离婚,老粉天塌了

财经要闻

特朗普无牌可打

汽车要闻

轴距增加60mm还配副驾屏 一汽-大众探岳L正式下线

态度原创

游戏
家居
房产
艺术
公开课

11月上旬XGP新增公布:《合金弹头战略版》等7款

家居要闻

摩登现代氛围 用色块勾勒空间

房产要闻

刺激!大批豪宅疯狂入市,海口住宅风向彻底变了!

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

公开课

AI如何揭开大自然和宇宙的奥秘

无障碍浏览 进入关怀版