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

遗留代码处理技巧与案例演示

0
分享至

来源 | OSCHINA 社区

作者 | 京东云开发者-冯鸿儒

原文链接:https://my.oschina.net/u/4090830/blog/5590099

1 什么是遗留代码

本质是一种技术债务,产生原因一方面是业务原因:如业务本身场景繁多、流程复杂等;另一方面是技术原因:如代码不规范、设计不合理、祖传代码文档注释缺失等。它会影响我们的程序很多方面:如可读性、可修改性、可复用性、可维护性、可测试性等。

2 遗留代码处理过程拆解

划分为梳理 -> 重构 / 重写 -> 替换 / 验证三个阶段

2.1 梳理

遗留代码的处理是一种逆向工程,从已有的代码 + 数据模型 + 文档倒推出业务模型、交互和规则,在保真的前提下再重新构建代码 + 数据模型 + 文档。
我们这里可以参考下 DDD 领域驱动设计里战略设计部分常用的工具(事件风暴法)来进行这部分梳理工作。

事件风暴本质上是一种系统建模的方法,与它处于对等位置的,会有 “UML 建模”、“事件驱动建模” 等。事件风暴跟敏捷开发里的一些理念(如用户故事)的产生背景类似,都是在理性思考无法应对变化频繁且文字难以描述的情况下,通过一些辅助性的提示卡片、视觉手段,辅以相关人员的集中、高频沟通来完成对于业务的准确把握和抽象建模。

事件风暴的过程:

  1. 通过梳理业务流程,创建相应的领域事件(Event)

  2. 补充引发每个领域事件的命令(Command)

  3. 通过实体 / 聚合把命令和事件关联起来

  4. 划分领域边界及事件流动线条

  5. 识别用户操作所需的关联视图及其角色

事件风暴的产物:

  1. 领域对象 即实体 / 聚合。这里的领域对象并非数据库模型, 而是与业务紧密联系的 “对象”。因为事件风暴是一种面向对象的建模方式, 而不是面向数据库的建模方式。

  2. 领域事件 即对象在某些操作或特点时点下所产生的事件, 这些事件将决定之后多个聚合和限界上下文(BC)之间的通讯方式。

  3. 限界上下文 当所有的对象(实体 / 聚合)被梳理出来后,属于同一种 “通用语言” 的对象, 则会被归入同一个限界上下文边界内;不属于同一种 “通用语言” 的对象, 则会被边界给分割开,划入不同的子域或限界上下文。

梳理结果示例:

2.2 重构 / 重写

通过重构 / 重写对软件要素进行重新组织,使其不改变外部行为的情况下,提升代码的可读性或使其结构更合理。

针对不同层次的软件要素要做不同的处理和控制:

并且整个重构 / 重写过程有些需要遵照的原则:

  1. 单一职责:可以将依赖归拢,统一行为和控制。权责明确,场景明确。

  2. 单一原则:消除重复的数据声明、行为;因为单一所以保证了复用,统一标准 ,可装配性。

  3. 封装原则:不需要过度关心依赖类内部实现,最好一个。就能调用。

  4. 归属原则:上帝的归上帝,凯撒的归凯撒。谁提供的数据更多,归属于谁。

  5. 抽象层次:越高层的抽象越稳定,越细节的东西越容易变化。举例:接口应传递职责而非实现细节。

  6. 开闭原则:对修改关闭,对扩展开放。

  7. kiss 原则:好理解,好维护。

  8. 清晰原则:只读小部分代码就可以知道怎么改逻辑,做扩展。而不是要通读所有代码,才能理清。

其中有两点落地细节我们具体分析下:

  1. 业务逻辑的处理
    业务代码和技术代码解耦
    主流程代码和附加流程代码解耦
    长链路的拆解编排

  2. 关注点的分离
    双向依赖:上下文之间缺少一层未被澄清的上下文,或者两个上下文其实可被合为一个;
    循环依赖:任何一个上下文发生变更,依赖链条上的上下文均需要改变;
    过深的依赖:自身依赖的信息不能直接从依赖者获取到,需要通过依赖者从其依赖的上下文获取并传递,依赖链路过长,依赖链条上的任何一个上下文发生变更,其链条后的任何一个上下文均可能需要改变;

2.3 替换验证

大概分为以下几个要点:

  1. 领会意图,抽取用例,增加可复测性

  2. 增加可监测性

  3. 分成小块,逐步替换

  4. 试点、看到成效

可借助过程管理工具如 PDCA 法进行管理

3 案例演示3.1 案例 1:针对强耦合的实现做重构

原始需求:案例为一个转账服务,用户可以通过银行网页转账给另一个账号,支持跨币种转账。同时因为监管和对账需求,需要记录本次转账活动。

原始架构:是一个传统的三层分层结构:UI 层、业务层、和基础设施层。上层对于下层有直接的依赖关系,导致耦合度过高。在业务层中对于下层的基础设施有强依赖,耦合度高。我们需要对这张图上的每个节点做抽象和整理,来降低对外部依赖的耦合度。

重构关键设计点:

重构后代码特征:

业务逻辑清晰,数据存储和业务逻辑完全分隔。
Entity、Domain Primitive、Domain Service 都是独立的对象,没有任何外部依赖,但是却包含了所有核心业务逻辑,可以单独完整测试。
原有的转账服务不再包括任何计算逻辑,仅仅作为组件编排,所有逻辑均 delegate 到其他组件。

3.2 案例 2:提高老代码的复用性

原始需求:现有几个策略实现类,被很多代码使用。现在需要根据不同的业务方在每个策略执行前做不同的前置逻辑处理。

解法分析:尽量避免把逻辑耦合到已有的实现类中。引入外部类进行控制反转。这里我们使用访问者模式。

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。

具体实现:

重构后代码特征:

可以通过访问者对老代码逻辑进行编排,将修改外置,减少对老逻辑的影响。通过 java8 默认接口实现提供默认访问行为,避免大量策略子类的感知,只需要需要提供自己实现行为的子类对默认实现进行覆写。

4 总结

遗留代码的处理能力一方面是对技术的要求,另一方面也是对业务掌握的挑战。希望我们可以跨越荆棘、穿过迷雾,顺利到达成功的彼岸!

作者:冯鸿儒

【OSCHINA 2022 中国开源开发者问卷】来啦

你的反馈将有助于反映中国开源的全貌

问卷结尾还可抽取我们的周边好物哦~

期待来自你的反馈!

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

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-11-14 23:00:11
72岁的毛主席和江青的一张合影,毛主席依旧腰板挺直头发乌黑

72岁的毛主席和江青的一张合影,毛主席依旧腰板挺直头发乌黑

大江
2024-11-14 13:50:54
耗资20多亿的古城日均卖票不足20张!省委书记现场步行察看

耗资20多亿的古城日均卖票不足20张!省委书记现场步行察看

政知新媒体
2024-11-14 07:09:13
全都“叛变”了!台积电、三星接连宣布,外媒:中国不买了?

全都“叛变”了!台积电、三星接连宣布,外媒:中国不买了?

阿伧说事
2024-11-14 16:36:48
太炸裂!知名演员意外发出“裸照”后秒删,公司回应……

太炸裂!知名演员意外发出“裸照”后秒删,公司回应……

极目新闻
2024-11-14 19:29:16
通报来了!女童被开水烫伤收威胁信,获赔32万,问责12人 3人免职

通报来了!女童被开水烫伤收威胁信,获赔32万,问责12人 3人免职

鋭娱之乐
2024-11-14 21:06:56
国足1-0绝杀巴林,赛后评分:不是张玉宁获第一,而是中国队14号

国足1-0绝杀巴林,赛后评分:不是张玉宁获第一,而是中国队14号

侃球熊弟
2024-11-14 23:58:23
又来!莫兰特替补席炫手枪,死性不改啊,曾禁赛25场+损失760万

又来!莫兰特替补席炫手枪,死性不改啊,曾禁赛25场+损失760万

球童无忌
2024-11-14 14:32:18
海关总署:对供人类食用腌制肉产品、燕窝等不再实施检疫审批管理

海关总署:对供人类食用腌制肉产品、燕窝等不再实施检疫审批管理

新京报
2024-11-14 21:15:18
范冰冰戴千万翡翠自拍,手掌大冰种观音像太吸睛,素颜驾驭不俗气

范冰冰戴千万翡翠自拍,手掌大冰种观音像太吸睛,素颜驾驭不俗气

鑫鑫说说
2024-11-15 09:00:08
中方连劝3次后,不到72小时,美通过法案,要对华实施毁灭性制裁

中方连劝3次后,不到72小时,美通过法案,要对华实施毁灭性制裁

现代小青青慕慕
2024-11-15 07:34:49
国足42秒神剧!张玉宁一瘸一拐庆祝:拼到上担架,头号英雄

国足42秒神剧!张玉宁一瘸一拐庆祝:拼到上担架,头号英雄

叶青足球世界
2024-11-15 00:26:55
俄军竟从莫斯科电影厂接收坦克!库尔斯克将迎来大决战

俄军竟从莫斯科电影厂接收坦克!库尔斯克将迎来大决战

项鹏飞
2024-11-14 18:19:44
特朗普任命贾巴德,盟国网友惊慌失措!

特朗普任命贾巴德,盟国网友惊慌失措!

狗剩说电影
2024-11-14 14:12:15
1996年,安徽滁州,18岁的刘涛在南京担任文艺兵

1996年,安徽滁州,18岁的刘涛在南京担任文艺兵

视点历史
2024-10-14 22:16:11
1-2遭逆转!阿根廷爆冷:4场2败丢8分,梅西哑火,冲突不断

1-2遭逆转!阿根廷爆冷:4场2败丢8分,梅西哑火,冲突不断

叶青足球世界
2024-11-15 09:31:18
我国成为枪爆暴力犯罪发案最低的国家之一

我国成为枪爆暴力犯罪发案最低的国家之一

北青网-北京青年报
2024-11-15 00:38:41
巴西爆冷1-1,维尼修斯失点+妙传被浪费,拉菲尼亚世界波难换3分

巴西爆冷1-1,维尼修斯失点+妙传被浪费,拉菲尼亚世界波难换3分

侧身凌空斩
2024-11-15 06:56:49
张雪峰:千万不要混,一个月五千,20岁混到 30 岁就混了六十来万

张雪峰:千万不要混,一个月五千,20岁混到 30 岁就混了六十来万

清风拂心
2024-11-13 14:43:39
4天在库尔斯克损失88个装甲单位!长驱直入,俄军闯进库皮扬斯克

4天在库尔斯克损失88个装甲单位!长驱直入,俄军闯进库皮扬斯克

鹰眼Defence
2024-11-14 17:10:25
2024-11-15 13:28:49
开源中国
开源中国
每天为开发者推送最新技术资讯
6590文章数 34154关注度
往期回顾 全部

科技要闻

奇瑞董事长夸余承东:你改名余成功吧

头条要闻

以防长将"解除黎真主党武装力量" 以军官听后一脸惊讶

头条要闻

以防长将"解除黎真主党武装力量" 以军官听后一脸惊讶

体育要闻

我们究竟需要一支怎样的国家队?

娱乐要闻

娜扎和张云龙恋爱,男帅女美挺好

财经要闻

紫金矿业哥国矿山到底"被掠走"多少黄金?

汽车要闻

售136.8万起 路特斯EMEYA繁花高定版亮相车展

态度原创

亲子
健康
旅游
艺术
公开课

亲子要闻

成都果然有自己的潮流,亲子出游也这么方便

花18万治疗阿尔茨海默病,值不值?

旅游要闻

大庸古城日均不足20人,商家自称苟延残喘

艺术要闻

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

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版