同城售后系统退款业务重构心得 | 京东云技术团队

一、重构背景

1.1、退款

到家、小时购、天选退款有2套结构,代码逻辑混乱;

其中小时购、天选部分售后单是和平生pop交互退款,部分是和售后中台交互退款;并且兼容3套逻辑;

痛点:代码繁重,缺乏合理性的设计,后续迭代开发以及维护成本高,同时增加了系统的风险和不稳定性

1.2、金额计算

到家、小时购两套独立的逻辑结构计算,在此基础上针对退差和非退差又实现了2套逻辑;

针对商品件维度、商品行维度、售后单维度计算金额混乱,缺乏领域边界分层设计

痛点:售后单维度、商品行维度、拆分件维度金额计算混乱,代码缺乏层次结构;代码易读性维护成本、后续扩展性存在问题

1.3、售后逆向账

售后单详情接口、申诉单详情接口,针对到家和小时购做了两套逻辑;

其中售后单详情接口针对小时购黑名单、小时购白名单、天选、到家退差、到家非退差做了5套逻辑处理;

并且这两个接口都是实时从拆分获取金额进行售后逆向拆分计算,可以直接从数据库中进行取值赋值,不需要进行售后单维度的拆分计算;

痛点:代码大量冗余、改动成本高、增加了系统的风险不稳定性

二、重构思路和方案

2.1、重构思路

什么是重构呢?

名词:对软件内部结构的一种调整,目的是在不改变软件观察行为的的前提下提高其可理解性、降低其修改成本;

动词:使用一系列手法,在不改变软件可观察行为的前提下,调整其结构

重构的目的是使系统或代码更容易被理解、修改、迭代

重构秘诀:胆大心细

胆大(意味着有勇气和决心去改变和改进现有的代码。重构可能涉及对复杂的代码结构进行修改,甚至可能需要重写部分代码。胆大的开发者愿意面对这些挑战,相信通过改变可以带来更好的结果)

心细(指的是在进行重构时保持细致入微的思考和行动。这包括仔细分析代码的结构和逻辑,理解代码的功能和依赖关系,以及考虑每个重构步骤可能带来的潜在影响。心细的开发者会在重构过程中小心翼翼地处理每个细节,以确保代码的正确性和可维护性)

  1. 把握好重构时机:当我发现售后退款、金额计算等业务模块代码存在质量问题、可读性差、可维护性差或存在坏味道时,并且在项目需求排期并不紧张的情况下,是进行重构的好时机;

  2. 前期梳理很重要,先找到痛点 ;不宜长线作战,不宜和业务并行

  3. 明确出目标和价值:售后退款、金额计算重构后能提高开发效率、降低维护、开发成本等

  4. 确定重构的目标:首先要明确需要进行重构的代码块或功能,并明确重构的目标是什么。例如,可能需要提高代码的可读性、可维护性或性能。

  5. 分析代码坏味道:使用代码静态分析工具或手动检查代码,识别出可能存在的代码坏味道;例如退款业务中存在1000多行的类、600多行的方法,过多的变量参数、诸多重复代码等代码坏味道。

  6. 选择适当的重构技术:根据售后代码坏味道的种类和重构的目标,选择适当的重构技术。我采用的重构手法是:小规模重构–>大规模重构–>顶层设计模式;采用先小后大,从大到全的思路进行重构设计。小规模重构:提取方法、消除超大类或函数方法、提取类、重命名、合并重复代码等方法;大规模重构:采用的是分层、模块化、解耦、抽象可复用性等手法;设计模式:退款业务采用策略模式+抽象工厂;金额计算业务采用策略模式+抽象工厂+责任链模式

  7. 编写测试用例:在进行重构之前,编写适当的测试用例来验证重构后的代码的正确性。测试用例应该覆盖重构的代码块或功能的各种情况。

  8. 执行重构:根据选择的重构技术,逐步修改代码。确保每次修改后的代码仍然通过之前编写的测试用例。

  9. 运行测试用例:在每次重构之后,运行之前编写的测试用例,确保重构后的代码仍然正确。

  10. 重构后的代码评估:评估重构后的代码是否达到了预期的目标,例如是否提高了代码的可读性、可维护性或性能。

2.2、重构方案

2.2.1、重构前系统交互图

2.2.2、重构后系统交互图

退款业务强耦合到售后系统中,并且业务代码分散到各个业务层,严重缺乏系统的领域边界和分层设计,重构后退款业务逻辑不强依赖售后核心业务逻辑,做到可以独立部署。

2.2.3、重构前金额计算流程图

2.2.4、重构后金额计算流程图

将2套金额计算业务逻辑利用设计模式将其合并为1套金额计算业务逻辑,打造防腐层

2.3、重构设计类图

依据上述制定的设计方案流程图,我进行了UML类图的绘制,以下是关于金额计算业务模块的类图

2.3.1、抽象工厂+策略模式类图

2.3.2、责任链模式类图

三、系统稳定性保障

3.1、小步重构

将售后重构分成退款、金额计算、逆向账三个步骤,并在每个步骤之后运行测试用例。这样可以及时发现并修复引入的错误,避免错误在整个系统中蔓延

3.2、逐步验证

在每个重构步骤之后,进行系统的逐步验证。分批次进行上线灰度,灰度配置绝对隔离,不能复用。确保系统的各个部分在重构过程中都能正常运行,并与其他部分协调良好。

3.3、监控和性能测试

在重构完成后,进行系统的监控和性能测试,确保重构没有引入性能问题或影响系统的稳定性。如果发现问题,及时进行修复和优化。

3.4、团队代码审查和测试

在进行重构时,与团队成员进行合作,并进行代码审查。多个人的视角和经验可以帮助发现潜在的问题,并提供改进的建议;针对重构代码进行深度解刨,能更有效地保障重构的安全性。

重构业务及时通知测试人员,使测试人员能够评估到测试点,更加完善测试用例

3.5、灰度步骤

3.5.1、bcp持续比对校验

3.5.2、按照商家灰度

依据售后单量 小->中->大 的顺序逐步进行灰度切量,观察其退款、金额计算等售后单数据是否异常

四、重构成果

  1. 降低开发、维护成本

  2. 提升代码质量、系统稳定性

  3. 系统扩展性和灵活性的加强;

  4. 系统应用、业务边界定位更加清晰

  5. 统一和规范售后核心业务脉络,降低业务学习成本,提升开发效率

  6. 提升自己的技术能力、代码质量意识、问题解决能力、团队合作和沟通能力;经典著作《重构》这本书中有这么一段话:

一开始,我所做的重构都停留在细枝末节上。随着代码趋向简洁,我发现自己可以看到一些设计层面的东西了,这些是我以前理解不到的,如果没有重构,我达不到这种高度

五、code show

5.1、重构前金额计算

到家售后单金额计算service方法

京东售后单金额计算service方法

一个大的金额计算class类就有1000多行代码,每个方法中都有几百行代码,以下是到家售后单金额计算部分代码

5.2、重构后金额计算

到家和京东售后单金额计算用同一个接口才承接业务实现,并且使用策略+抽象工厂模式实现到家、小时购、天选业务的金额计算

策略模式获取金额拆分结果集

金额计算核心方法只有4步骤

其中金额计算的核心则采用的是责任链业务进行计算

在件维度、sku维度针对不同的业务又采用了责任链模式进行金额计算

六、参考文献

代码的坏味道: https://www.qinglite.cn/doc/87036476d565d55f9

《重构改善既有代码的设计》:[美]MartinFowler

《敏捷软件开发》:[美]RobertC.Martin

作者:京东零售 高凯

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178973.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

素材收藏必备!免费获取这5个矢量图标库,设计更得心应手!

可以自由拉伸的矢量图标,在平面设计流程中的重要性,有过设计经验的用户一定不会陌生。 下面,我们给大家准备了5个免费使用的矢量logo图标库,建议大家一键收藏。 1:即时设计 即时设计的资源社区内有海量免费的矢量图…

PostgreSQL 数据库日志相关参数

PostgreSQL数据库的配置主要是通过修改数据目录下的 postgresql.conf和pg_hba.conf文件来实现的。 如果想从其他机器上登录该数据 库,需要把监听地址改成实际网络的地址,一种简单的方法是把地址 改成“*”,表示在本地的所有地址上监听&#…

新手学计算机编程入门,自学编程入门从哪里入手开始学习

新手学计算机编程入门,自学编程入门从哪里入手开始学习 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,向如图这个…

AndroidPicker的使用

项目地址:https://github.com/gzu-liyujiang/AndroidPicker 历史版本:https://github.com/gzu-liyujiang/AndroidPicker/blob/master/ChangeLog.md 依赖配置 // JitPack 远程仓库:https://jitpack.iomaven { url https://jitpack.io } 所有选择器的基…

Make.com实现多个APP应用的自动化的入门指南

Make.com是一款基于云的自动化平台,可帮助用户将多个应用程序连接在一起,并通过设置自动化流程来简化日常任务。Make.com提供丰富的API集成,支持连接各种流行的应用程序,包括社交媒体、电子商务、CRM等。 使用Make.com实现多个AP…

社区智能奶柜,未来市场新机遇

我们无法左右大局,但可以通过对时代趋势的深入理解,精准把握机遇,乘势而上!未来优秀的商业项目,将遵循以下几个标准:产品具有高频需求、刚性需求、高毛利空间和低人力成本。社区智能奶柜之所以能在当前市场…

内网穿透配置-Cpolar-Ngrok

文章目录 一、Cpolar1、cpolar软件的使用:(1)下载与安装(2)cpolar指定authtoken(3)获取临时域名(4)验证临时域名有效性 二、Ngrok1、配置内网穿透(1&#xff…

【HTML】播放器如何自动播放【已解决】

自动播放器策略 先了解浏览器的自动播放器策略 始终允许静音自动播放在以下情况,带声音的自动播放才会被允许 2.1 用户已经与当前域进行交互 2.2 在桌面上,用户的媒体参与指数阈值(MEI)已被越过,这意味着用户以前播放带有声音的视频。 2.3 …

MySQL使用存储过程迁移用户表数据,过滤用户名相同名称不同的用户

存储过程简介 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。它是一段预编译的SQL…

开源的网站数据分析统计平台——Matomo

Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面,就可以看到登陆…

Android系统Launcher启动流程学习(一)init启动部分

init进程学习: 文件路径system/core/init/init.cpp 解析init.rc配置文件,首先开启ServiceManager和MediaServer等关键进程init进程fork启动Zygote服务进程处理子进程的终止(signal方式)提供属性服务的功能 int main(int argc, char** argv) {//注释一…

2024上海国际人工智能展(CSITF)“创新驱动发展·科技引领未来”

人工智能(Artificial Intelligence,AI)作为当今世界科技发展的关键领域之一,正不断推动着各行各业的创新和变革。作为世界上最大的消费市场之一,中国正在积极努力将AI技术与产业融合并加速推广应用。在这个背景下&…

MYSQL体系结构总结

(笔记整理自b站马士兵教育课程) MYSQL总体分为服务层和存储引擎层。 一、服务层 功能: 1、连接:管理连接,权限验证。 2、解析器:词法分析,语法分析。 3、优化器:执行计划生成…

vue el-table-column 修改一整列的背景颜色

目录 修改表头以及一整列数据的背景颜色,效果如下: 总结 修改表头以及一整列数据的背景颜色,效果如下: 修改表头背景颜色:在el-table绑定header-cell-style 修改一整列的数据背景颜色:在el-table绑定:cel…

全志XR806实现简单的家用环境监测传感器

XR806是一款支持WiFi和BLE的高集成度无线MCU芯片, 以其集成度高、硬件设计简单、BOM成本低、安全可靠等优点, 成为极客们进行小开发创作的首选. 恰好最近获得了XR806开发板的试用资格,因此决定基于此开发板制作一个简单的家用环境监测传感器. 1.功能介绍 作为一个环境监测传感…

【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】

问题原因: nodejs版本太高(nodejs v17版本发布了openSSL3.0对短发和密钥大小增加了更为严格的限制,nodejs v17之前版本没有影响,但之后的版本会出现这个错误,物品的node版本是20.9.0) 解决方式&#xff1…

随想录一刷·数组part1

你好&#xff0c;我是安然无虞。 文章目录 1. 二分查找题型2. 移除元素题型 1. 二分查找题型 二分查找传送门 class Solution { public:int search(vector<int>& nums, int target) {// 在有序数组中查找第一时间想到二分查找int left 0, right nums.size() - 1…

ruby语言怎么写个通用爬虫程序?

Ruby语言爬虫是指使用Ruby编写的网络爬虫程序&#xff0c;用于自动化地从互联网上获取数据。其中&#xff0c;CRawler是一个基于文本的小型地牢爬虫&#xff0c;它被设计为可扩展&#xff0c;所有游戏数据均通过JSON文件提供&#xff0c;程序仅处理游戏引擎。除此之外&#xff…

Stream 流对象的创建与各方法

Stream 流对象的创建与各方法 目录 1.0 Stream 流的说明 2.0 Stream 流对象的创建 2.1 对于 Collection 系列集合创建 Stream 流对象的方式 2.2 对于 Map 系列集合创建 Stream 流对象的方式 2.3 对于数组创建 Stream 流对象的方式 3.0 Stream 流的中间方法 3.1 Stream 流的 …

【机器学习】四、计算学习理论

1 基础知识 计算学习理论&#xff08;computational learning theory&#xff09;&#xff1a;关于通过“计算”来进行“学习”的理论&#xff0c;即关于机器学习的理论基础&#xff0c;其目的是分析学习任务的困难本质&#xff0c;为学习算法体统理论保证&#xff0c;并根据结…