为什么组合好于继承?

随机子空间集成方法原理与scikit-learn实践 集成学习通过组合多个基学习器的预测结果来提升模型性能,是机器学习中的核心方法之一。随机子空间方法作为集成学习的重要变体,其核心原理是通过对特征空间进行随机子采样来增加模型多样性。这种方法特别适合处理高维数据,能有效缓解维度灾难问题,常与决策树、K近邻等对特征选择敏感的基学习器配合使用。在scikit-learn中,可以通过BaggingClassifier和BaggingRegressor实现随机子空间集成,关键参数包括max_features和n_estimators。实际应用中,该方法在金融风控、医疗诊 阅读详情

本文使用亲身案例形象说明了软件设计领域为什么组合Composition要好于继承(包括接口继承),只有需求分析域的问题分解,才有设计编程的组合应用。
来自游戏公司GameSys的Yan Cui发表了博文:

This is why you need Composition over Inheritance
他试图对一个刚刚接触自己还是不太熟悉的系统进行一些旧代码修改,很自然地,第一步首先是了解这些旧代码是做什么的,开始从需要改变的地方查看类代码了。

uploadShowAction.shtml?id=30847&oid=2314

有过类似经验的人可能不会奇怪,他一无所获,无法发现这些类是干什么的,这个类只包含少数override方法,但是无法知道它们是如何搭配在一起工作的。
于是他进一步深入抽象类的多个层次,直到到达这个类层次的基类,从这个基类开始在顺着继承树形结构来回好几次,终于得到了一个有关业务逻辑分散在各层次之间的模糊概念。

uploadShowAction.shtml?id=30848&oid=2314

更有甚者,因为与原来树形控制流有点区别,因此他们有得重新做一个新的树形继承结构的控制流,这些使人更加难以理解了。
这些都不是程序员想要,他们需要容易方便地且有信心地思考reason自己的代码。或者说,让自己的代码像文章一样有条理性。
是不是大部分人都有这样类似痛苦经历呢?那么如何应用组合而不是继承呢Composition over Inheritance?
Wiki中Composition over Inheritance定义是领域建模:
使用组合而不是继承是一种设计原则,能够带来设计的更高灵活性,带给业务领域的类代码更长时间的稳定性。
对于Wiki这段结论,作者他说自己不是一个“下结论的粉丝”(a fan of conclusions banq注:应试教育容易导致人们喜欢下结论以及看文章时只有看到下结论才认为自己看明白,因为考试题总是有唯一标准肯定终结的答案的,长期做考题容易被误导成这种思维模式)。
既然我们不直接接受这种结论,那么我们就需要质疑反思,这段话到底是什么意思呢?为什么有这段话呢?能给出高灵活性和业务领域更稳定的证明或经验证据吗?
从作者的角度看,使用组合而不是继承是鼓励更好的问题域的解耦,起初如果你不将一个大问题分解成一个个更小的容易解决的小部分问题,后来你就无法使用组合来组装它们。
Scott Wlaschin的
railway oriented programming 意味使用了一个很好的案例来说明在实践中如何使用组合。
EventSourcing/CQRS的倡导者Greg Young还指出,问题域的分解是我们当前软件工业的最大问题。
问题域的分解不只是局限于代码组织,微服务也是一个这方面的典型案例,从巨石monolithic铁板一块哦系统迁移到微服务是另外一种问题域的解耦。
因此,我们需要使用利刀分解前面描述的类层次树形结构,使用更小的、可组合的替换它们,包括使用具有这样特点的语言如F#等。
参考:
Go语言是彻底的面向组合的 并发 语言
分解和组合的抽象方法
范畴category:组合的本质
Sigrity Power Tree如何进行直流压降仿真分析操作指导 Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。 阅读详情

相关推荐

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

为什么组合优先于继承

面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。同样地,在《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。 为什么不推荐使用继承 每个人在刚刚学习面向对象编程时都会觉得:继承可以实现类的复用。所以,很多开发人员在需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的。继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的

Hopefully Sky的博客 1万+

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2101

为什么说组合要优于继承

通过组合,我们可以减少代码的耦合性,提高代码的灵活性和可定制性。在实际开发中,我们应当谨慎使用继承,并根据具体的需求选择合适的设计方式,以实现可维护、可扩展和灵活的代码结构。然而,这种过度依赖继承的做法不仅违背了继承应当谨慎使用的初衷,还导致了代码的脆弱性增加和灵活性降低。当需要添加新的图形类型时,只需要创建一个新的实现Shape接口的类即可,不会影响到其他图形类的实现。这样做的问题在于,当我们需要添加新的图形类型时,就需要修改基类Shape的实现,这将影响到所有继承自Shape的子类。

C_19870的博客 579

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 937

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8202

软件设计原则之组合优于继承

“组合优于继承”是一个面向对象编程的设计原则,它建议我们在需要复用代码的时候,尽量使用组合(has-a)的方式,而不是继承(is-a)的方式。组合是指一个类包含另一个类的对象作为自己的属性,而继承是指一个类直接从另一个类派生出来,拥有其所有的属性和方法。

hpx666的博客 1943

Excel聚光灯效果终极指南:VBA代码实现与条件格式避坑技巧

本文详细解析了Excel聚光灯效果的实现方法,包括VBA代码优化与条件格式的避坑技巧。通过模块化编程和性能优化技术,帮助用户高效处理大型数据表格,实现自定义高亮显示,提升数据分析和报表阅读体验。

v6b7n8m9q0的博客 456

设计模式:为什么推荐使用组合而不是继承_为什么推荐使用组合而不是继承呢

综上所述,虽然继承在某些情况下是有用的,比如当确实存在一个清晰的“是一个”关系,并且不会频繁变动时,它可以使代码更简洁、更直观。的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?5、LVS、Nginx、HAproxy有什么区别?7、Tomcat和Resin有什么区别,工作中你怎么选择?

2401_83974783的博客 602

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。

仙魁XAN 1万+

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2080

为什么建议多用组合少用继承

为什么建议多用组合少用继承

qq_43586337的博客 1167

Uniapp返回上一页并刷新:亲测有效的 goBack 实现技巧!

这个技巧在实际开发中非常常用,特别适合表单提交后返回列表刷新这类场景。比起依赖onShow或复杂的vuex状态同步,这种方式更直接、好维护,也不容易出 bug。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1840

为什么要多用组合少用继承?

面向对象编程时,有十条很重要的原则: 代码复用 封装变化 开闭原则 单一责任原则 依赖注入/依赖倒置原则 里氏替换原则(LSP) 接口隔离原则(ISP) 多用组合,少用继承 面向接口编程 委托原则

关注移动端、Web、微信小程序等大前端领域 9779

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么Java要求多用组合,少用继承?

最近有一个要好的朋友去阿里大厂面试Java高级工程师,在第二轮面试的过程中,面试官提了一个问题:“解释下Java项目中为什么要求多用组合,少用继承?朋友觉得这个题目既熟悉,又陌生,毕竟继承与组合在一开始学习Java时就要求掌握的,但是教学过程中只是说了它们的概念及基本理论知识,没有介绍它们之间孰优孰弱的问题,实际开发中也没有刻意去将它们进行比较。一时间竟然答不上来。那么面试官为什么要问这个问题呢?

lovoo的博客 1702

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

为什么说多用组合,少用继承?

对类的功能的扩展,要多用组合,少用继承。 对于类的扩展,在面向对象的编程过程中,我们首先想到的是类的继承,由子类继承父类,从而完成了对子类功能的扩展。但是,面向对象的原则告诉我们,对类的功能的扩展要多用组合,而少用继承。其中的原因有以下几点: 第一、子类对父类的继承是全部的公有和受保护的继承,这使得子类可能继承了对子类无用甚至有害的父类的方法。换句话说,子类只希望继承父类的一部分方法,怎么办? 第...

shihao的博客 2008

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

为什么说组合优于继承?

继承和组合之间的选择取决于软件设计的要求和目标。一般来说,建议尽可能使用组合,以避免强耦合。当需要建立明确的“是”关系和类层次结构时,继承很有用,但应谨慎使用,以避免长期设计问题。在许多情况下,继承和组合的平衡组合可能是最佳解决方案。参考:

做兴趣使然的Hero 1188

java中为什么要少用继承多用组合

最近的接收的一套代码,真是吐血,我在代码审查的时候发现系统代码一大堆问题,阅读起来非常艰涩难懂,主要是系统代码中使用了大量得到继承,什么都是继承。而且是嵌套多层。这种设计真的很垃圾。继承在代码中本来是好事,但是用的多了就是坏事了,特别是嵌套层次多的继承。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1785

设计模式:为什么说要多用组合少用继承?如何决定该用组合还是继承?

为什么不推荐使用继承 继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有很多作用,但继承层次过深、过复杂,也会影响代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多人觉得继承是一种反模式,应该尽量少用,甚至不用。为什么会有这样的争议,我们通过一个例子来解释一下。 假设我们要设计一个关于鸟的类。我们将“鸟类”这样一个抽象的事务概念,定义为一个抽象类AbstractBird。所有更细分的类,比如麻雀、鸽子、乌鸦等,都继承这个抽象类。 我们知道,大

OceanStar的博客 1244

在设计原则中,为什么反复强调组合要优于继承?

推荐大家关注一个公众号点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文even if you get no applause, yo...

程序员小乐 401

面试官:Java 设计原则中,为什么反复强调组合要优先于继承?

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...

weixin_44421461的博客 273

为什么组合优于继承

你真的理解组合优于继承吗?

2301_81243054的博客 403

java中为什么建议多用组合少用继承?

指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是黑盒式代码复用。如果是必须的,则继承是必要的。继承,在写代码的时候就要指名具体继承哪个类,所以,在编译期就确定了关系。(从基类继承来的实现是无法在运行期动态改变的,因此降低了应用的灵活性。组合(Composition)体现的是整体与部分、拥有的关系,即has-a的关系。

o0oho的博客 875

java 组合优与继承_为什么组合优于继承?

1.JavaBean如何设计我们有一个User类,但是需要不同的角色,自然而然的我们想到了继承public class User{public String name;public String email;public String password;}public class Student extends User{}public class Admin extends User...

weixin_39940425的博客 196

由“为什么VO不能继承PO?” 引出的为什么组合优于继承?

我在个人项目中喜欢直接使用各种 `model` 来继承 `po`,单纯的因为可以直接省去写各种重复 `getter` 和 `setter` 的步骤,并且不需要使用各种拷贝工具。但是,搞`vo`、`do`、`po`,还有其他各种 `o`,是为了解藕它们之间的联系,而继承却是建立它们之间的耦合关系,确实是会限制类的扩展性和灵活性。

ShockChen7的博客 1429

为什么多用组合,少用继承?

http://zyjwy02.iteye.com/blog/232838 继承 和组合 都是实现类重用 的手段,何时用继承何时用组合? 继承表示“is a”的关系,继承是对已有的类做一番改造,以此获得一个特殊的版本。即将一个较为抽象的类改造成能适用于某些特定需求的类。组合表示“has a”的关系,如果两个类之间有明显的整体/部分的关系,适合用组合,比如People和Arm类。将Arm...

保持学习、思考和实践 460
上一篇: 基于分布式流计算平台(storm)的CGI采集与清理系统
下一篇: 程序员最重要最应该学习什么?
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值