0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是遗留代码?遗留代码处理过程拆解

OSC开源社区 来源:OSCHINA 社区 作者:京东云开发者-冯鸿 2022-11-11 09:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1 什么是遗留代码

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

2 遗留代码处理过程拆解

划分为梳理 -> 重构 / 重写 -> 替换 / 验证三个阶段 bdba9462-60ff-11ed-8abf-dac502259ad0.png

2.1 梳理

遗留代码的处理是一种逆向工程,从已有的代码 + 数据模型 + 文档倒推出业务模型、交互和规则,在保真的前提下再重新构建代码 + 数据模型 + 文档。

我们这里可以参考下 DDD 领域驱动设计里战略设计部分常用的工具(事件风暴法)来进行这部分梳理工作。

bdeb6556-60ff-11ed-8abf-dac502259ad0.png

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

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

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

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

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

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

事件风暴的产物:

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

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

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

梳理结果示例:

be2b8be0-60ff-11ed-8abf-dac502259ad0.png

2.2 重构 / 重写

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

be730cc2-60ff-11ed-8abf-dac502259ad0.png

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

bf08594e-60ff-11ed-8abf-dac502259ad0.png

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

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

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

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

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

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

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

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

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

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

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

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

2.3 替换验证

大概分为以下几个要点:

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

增加可监测性

分成小块,逐步替换

试点、看到成效

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

bf866bd6-60ff-11ed-8abf-dac502259ad0.png

3 案例演示

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

原始需求:案例为一个转账服务,用户可以通过银行网页转账给另一个账号,支持跨币种转账。同时因为监管和对账需求,需要记录本次转账活动。 原始架构:是一个传统的三层分层结构:UI 层、业务层、和基础设施层。上层对于下层有直接的依赖关系,导致耦合度过高。在业务层中对于下层的基础设施有强依赖,耦合度高。我们需要对这张图上的每个节点做抽象和整理,来降低对外部依赖的耦合度。

bfa0e48e-60ff-11ed-8abf-dac502259ad0.png

重构关键设计点:

c05629e8-60ff-11ed-8abf-dac502259ad0.png

重构后代码特征: 业务逻辑清晰,数据存储和业务逻辑完全分隔。

Entity、Domain Primitive、Domain Service 都是独立的对象,没有任何外部依赖,但是却包含了所有核心业务逻辑,可以单独完整测试。

原有的转账服务不再包括任何计算逻辑,仅仅作为组件编排,所有逻辑均 delegate 到其他组件。

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

原始需求:现有几个策略实现类,被很多代码使用。现在需要根据不同的业务方在每个策略执行前做不同的前置逻辑处理。 解法分析:尽量避免把逻辑耦合到已有的实现类中。引入外部类进行控制反转。这里我们使用访问者模式。 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。

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

c09c3a46-60ff-11ed-8abf-dac502259ad0.png

具体实现:

c0df306c-60ff-11ed-8abf-dac502259ad0.pngc11b1b18-60ff-11ed-8abf-dac502259ad0.png

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

4 总结

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





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UML
    UML
    +关注

    关注

    0

    文章

    123

    浏览量

    31500
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    21353
  • PDCA
    +关注

    关注

    0

    文章

    16

    浏览量

    3260

原文标题:遗留代码处理技巧与案例演示

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOS应用代码混淆技术方案

    代码混淆技术可以增加代码的复杂性和模糊性,从而提高攻击者分析代码的难度。
    的头像 发表于 11-21 16:17 5333次阅读
    HarmonyOS应用<b class='flag-5'>代码</b>混淆技术方案

    OLED代码分享

    OLED代码
    发表于 04-29 17:04 1次下载

    沐渥科技:氮气柜故障代码解读及处理建议

    氮气柜的故障代码因品牌和型号不同而有所差异,但通常涵盖一些常见问题。以下是沐渥科技对故障代码的解读及处理建议:一、代码解读和原因分析1、E1/E01/SensorError含义:氧气或
    的头像 发表于 03-20 13:18 961次阅读
    沐渥科技:氮气柜故障<b class='flag-5'>代码</b>解读及<b class='flag-5'>处理</b>建议

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码中获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    嵌入式软件开发中遗留代码的挑战

    遗留代码通常难以集成到其他系统、适配新数据格式或部署到现代平台及云端托管环境。相关代码可能已不再提供安全更新和补丁,供应商或开源社区的支持也可能逐渐减少甚至消失。然而,如果使用遗留
    的头像 发表于 02-26 10:05 640次阅读
    嵌入式软件开发中<b class='flag-5'>遗留</b><b class='flag-5'>代码</b>的挑战

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存泄漏。 大家觉得,这样的代码设计有没有问题。 代码
    的头像 发表于 02-11 09:31 666次阅读

    伺服故障代码有哪些?哪些处理方法?

    伺服故障代码有哪些?哪些处理方法?以三菱伺服驱动器为例,下面为故障代码分类及处理方法如下: 一、电源及连接类故障       1. AL.E6/ALE6.1 - 伺服紧急停止    
    的头像 发表于 02-06 14:06 1.4w次阅读
    伺服故障<b class='flag-5'>代码</b>有哪些?哪些<b class='flag-5'>处理</b>方法?

    代码与传统开发的区别 低代码与无代码开发的区别

    在软件开发领域,传统开发、低代码开发以及无代码开发是三种不同的开发方式,每种方式都有其独特的优势和适用场景。 一、低代码开发与传统开发的区别 低代码开发是一种新兴的应用程序开发方法,旨
    的头像 发表于 01-31 10:48 1055次阅读

    如何在日常开发过程中提高代码质量

    。 提高代码质量是一个系统工程,本文主要介绍开发人员如何在日常开发过程中提高代码质量。 01 什么是代码质量? 代码质量一般用于衡量
    的头像 发表于 01-23 09:09 1027次阅读
    如何在日常开发<b class='flag-5'>过程</b>中提高<b class='flag-5'>代码</b>质量

    EE-241:SHARC DSP到TigerSHARC处理代码移植指南

    电子发烧友网站提供《EE-241:SHARC DSP到TigerSHARC处理代码移植指南.pdf》资料免费下载
    发表于 01-13 15:35 0次下载
    EE-241:SHARC DSP到TigerSHARC<b class='flag-5'>处理</b>器<b class='flag-5'>代码</b>移植指南

    EE-149: 调试Blackfin处理器编译C源代码

    电子发烧友网站提供《EE-149: 调试Blackfin处理器编译C源代码.pdf》资料免费下载
    发表于 01-08 14:48 0次下载
    EE-149: 调试Blackfin<b class='flag-5'>处理</b>器编译C源<b class='flag-5'>代码</b>

    EE-230:第三代SHARC系列处理器上的代码叠加

    电子发烧友网站提供《EE-230:第三代SHARC系列处理器上的代码叠加.pdf》资料免费下载
    发表于 01-08 14:43 0次下载
    EE-230:第三代SHARC系列<b class='flag-5'>处理</b>器上的<b class='flag-5'>代码</b>叠加

    EE-322:面向SHARC处理器的专家代码生成器

    电子发烧友网站提供《EE-322:面向SHARC处理器的专家代码生成器.pdf》资料免费下载
    发表于 01-07 14:04 0次下载
    EE-322:面向SHARC<b class='flag-5'>处理</b>器的专家<b class='flag-5'>代码</b>生成器

    EE-134:为SHARC系列编写C兼容汇编代码中断处理程序

    电子发烧友网站提供《EE-134:为SHARC系列编写C兼容汇编代码中断处理程序.pdf》资料免费下载
    发表于 01-07 13:58 0次下载
    EE-134:为SHARC系列编写C兼容汇编<b class='flag-5'>代码</b>中断<b class='flag-5'>处理</b>程序

    探讨篇(三):代码复用的智慧 - 提升架构的效率与可维护性

    作者:京东物流 冯志文 前两篇从服务粒度和服务内的分层架构角度探讨,本文继续从服务间代码复用角度探讨。 背景 在分布式架构中,代码复用是个难题。那么如何处理代码功能共享的问题呢?本文结
    的头像 发表于 12-27 15:58 858次阅读
    探讨篇(三):<b class='flag-5'>代码</b>复用的智慧 - 提升架构的效率与可维护性