在软件开发中,代码复用是一把双刃剑。DDD的思想和工具帮助我们从业务角度权衡复用成本和效益,做出更优决策。
原文标题:代码复用:DDD视角下的平衡艺术
原文作者:阿里云开发者
冷月清谈:
* **降低开发成本:**快速整合现有能力,支撑新业务上线。
* **提升核心竞争力:**复用经过线上检验的模块,积累成功经验。
**复用策略的权衡**
* **深模块复用:**接口简单,功能深刻,复用成本低,效益高。
* **浅模块复用:**接口复杂,功能单一,复用成本高,效益低。
* **核心子域复用:**高价值模块,尽可能复用以提升竞争力。
* **通用子域复用:**技术通用性问题,复用降低研发成本。
**DDD视角下的复用决策**
* 从业务子域出发,结合技术和业务深度理解。
* 复用应该使模块出现在业务逻辑中**最合适的地方**。
怜星夜思:
2、文中提到“成功的设计来自对业务问题的深刻理解”。那么,对于技术人员来说,如何才能更好地理解业务问题?
3、在复用核心子域模块时,遇到技术架构不兼容的问题,该怎么办?
原文内容
刚工作时,代码写得不太好,师兄每次 CR 代码,总是会指着屏幕里的一坨代码说 “把它抽成一个类或函数”;“为什么呢?写在一起不是挺好的吗?” 我反问道;师兄老道地回答 “为了方便复用”;我仿佛若有所得,回到工位上把那些很长的代码全部抽象成了类和函数,感觉今天又有所成长。
二、DRY vs 重复代码:谁更好吗?
三、复用是一个权衡
-
首先我需要知道可复用构件的存在;
-
然后了解其中的结构和接口;
-
对接模块的接口,并且测试无误;
-
最后,只是会用还不够,如果线上出现,我必须保证自己对它有足够的了解,可以去排查该模块的问题;
-
降低开发成本。通过整合业务中台已有的支付,供应链等能力,可以快速支撑新的业务上线。
-
提升软件产品的核心竞争力。已有的模块经过线上检验,其中积累了过去成功的经验, 并且未来还会继续积累,直接复用能够大大提升产品的竞争力。
四、深浅模块:成本角度谈复用
谈到文件系统,或者数据库,应用肯定都是直接复用现有的开源软件,或者公司内专业团队定制的。不可能复制一份数据库代码到应用中。一方面是没这实力,更重要是不划算。
学习 SQL 相比学习 数据库实现 的成本,从相关书籍的厚度上就能看出一二,更何况它们的阅读难度相差也很大。
public void addParameter(List<String> params, String param) {
params.add(param);
}
《软件设计哲学》书中的配图,方块的宽度代表模块接口的复杂程度,深度代表功能的深刻程度,接口应该越简单越好,功能应该越深刻越好。深模块就是接口简单但是功能深刻的模块。
五、塑造产品的核心竞争力:效益角度谈复用
-
复用之前具有竞争力的技术模块,让过去的成功经验助力未来的产品成功
-
给用户提供一致的体验,考虑用户的使用习惯,降低学习成本
-
核心子域
-
特点:能够给公司带来核心竞争力的领域模块,拥有很高的复杂度和差异化价值;
-
案例:比如滴滴的司机调度算法,支付宝的交易系统,钉钉的 IM 系统等等;
-
复用策略:属于该子域的模块应该尽可能地复用, 将其竞争力也注入到其他产品,甚至投入精兵强将,提升其可扩展性,进一步拉开和竞争对手差距。
-
支持子域
-
特点:用来支撑核心子域,但是不能带来竞争力;
-
案例:比如运营管理系统,后台排查系统等等;
-
复用策略:因为不能带来核心竞争力,不如各个业务根据自己需求,使用脚手架快速搭建,定制起来还更加方便。
-
通用子域
-
特点:通用的业务或者技术问题领域, 比较复杂, 却不能给企业带来核心竞争力。好在一般有现成的解决方案,可以直接采购;
-
案例:比如财务系统,可以直接采购用友,金蝶;分库分表,消息队列可以直接使用开源软件,或者购买云上解决方案;
-
复用策略:尽可能复用,但是复用的目的与核心子域不同,主要是为了降低研发成本。
六、总结
世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活。
[01] 《复杂软件设计之道》
[02] 《架构整洁之道》
[03] 《软件设计哲学》







