每日一博 | 同城售后系统退款业务重构心得
一、重构背景
1.1、退款
到家、小时购、天选退款有2套结构,代码逻辑混乱;
其中小时购、天选部分售后单是和平生pop交互退款,部分是和售后中台交互退款;并且兼容3套逻辑;
痛点:代码繁重,缺乏合理性的设计,后续迭代开发以及维护成本高,同时增加了系统的风险和不稳定性
1.2、金额计算
到家、小时购两套独立的逻辑结构计算,在此基础上针对退差和非退差又实现了2套逻辑;
针对商品件维度、商品行维度、售后单维度计算金额混乱,缺乏领域边界和分层设计;
痛点:售后单维度、商品行维度、拆分件维度金额计算混乱,代码缺乏层次结构;代码易读性、维护成本、后续扩展性存在问题
1.3、售后逆向账
售后单详情接口、申诉单详情接口,针对到家和小时购做了两套逻辑;
其中售后单详情接口针对小时购黑名单、小时购白名单、天选、到家退差、到家非退差做了5套逻辑处理;
并且这两个接口都是实时从拆分获取金额进行售后逆向拆分计算,可以直接从数据库中进行取值赋值,不需要进行售后单维度的拆分计算;
痛点:代码大量冗余、改动成本高、增加了系统的风险和不稳定性
二、重构思路和方案
2.1、重构思路
什么是重构呢?
名词:对软件内部结构的一种调整,目的是在不改变软件观察行为的的前提下提高其可理解性、降低其修改成本;
动词:使用一系列手法,在不改变软件可观察行为的前提下,调整其结构
重构的目的是使系统或代码更容易被理解、修改、迭代
重构秘诀:胆大心细
胆大(意味着有勇气和决心去改变和改进现有的代码。重构可能涉及对复杂的代码结构进行修改,甚至可能需要重写部分代码。胆大的开发者愿意面对这些挑战,相信通过改变可以带来更好的结果)
心细(指的是在进行重构时保持细致入微的思考和行动。这包括仔细分析代码的结构和逻辑,理解代码的功能和依赖关系,以及考虑每个重构步骤可能带来的潜在影响。心细的开发者会在重构过程中小心翼翼地处理每个细节,以确保代码的正确性和可维护性)
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、按照商家灰度
依据售后单量 小->中->大 的顺序逐步进行灰度切量,观察其退款、金额计算等售后单数据是否异常
四、重构成果
一开始,我所做的重构都停留在细枝末节上。随着代码趋向简洁,我发现自己可以看到一些设计层面的东西了,这些是我以前理解不到的,如果没有重构,我达不到这种高度
五、code show
5.1、重构前金额计算
到家售后单金额计算service方法
京东售后单金额计算service方法
一个大的金额计算class类就有1000多行代码,每个方法中都有几百行代码,以下是到家售后单金额计算部分代码
5.2、重构后金额计算
到家和京东售后单金额计算用同一个接口才承接业务实现,并且使用策略+抽象工厂模式实现到家、小时购、天选业务的金额计算
策略模式获取金额拆分结果集
金额计算核心方法只有4步骤
其中金额计算的核心则采用的是责任链业务进行计算
在件维度、sku维度针对不同的业务又采用了责任链模式进行金额计算
六、参考文献
代码的坏味道: https://www.qinglite.cn/doc/87036476d565d55f9
《重构改善既有代码的设计》:[美]MartinFowler
《敏捷软件开发》:[美]RobertC.Martin
作者:京东零售 高凯
来源:京东云开发者社区 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
中国信通院杜刘通等:全球 6G 技术产业发展态势
0 引言 当前,以移动通信技术为代表的信息通信技术蓬勃发展,已成为加速数字经济与实体经济融合的重要推动力,在推动全球经济社会发展、产业结构变革和技术迭代创新方面持续发挥关键作用。纵观全球,5G已进入规模化商用阶段。据全球移动供应商协会统计,截至2023年5月,全球已有99 个国家和地区的254 家运营商推出了商用5G网络服务[1]。我国已建成规模较大、技术较先进的5G网络。与此同时,随着移动通信技术的持续演进,6G逐渐成为全球科技创新的重点领域。本文将从国际标准研究进展、全球发展态势、国内相关研究工作三个角度梳理全球6G发展现状,提出推动6G发展建议,为开展6G研究提供有益参考。 1 6G发展概述 按照移动通信技术“十年一代”的发展规律,6G最早将于2030年进入商用阶段。2022年3月,国际电信联盟(International Telecommunication Union,ITU)正式启动6G研究,明确了6G国际标准工作计划。2022年6月,ITU发布了面向2030及未来国际移动通信(International Mobile Telecommunications,IMT)技术趋势的...
- 下一篇
LAMMPS —— 分子动力学模拟工具包
LAMMPS ("Large-scale Atomic/Molecular Massively Parallel Simulator",大尺度原子/分子并行模拟工具)是由桑迪亚国家实验室开发的一套分子动力学模拟的开源程序包。LAMMPS当前使用C++编写,早期版本使用Fortran77以及Fortran90。 LAMMPS使用MPI实现多机器并行计算,在新的版本中,支持基于CUDA和OpenCL的GPU计算。 LAMMPS提供了元素周期表中原子对应的经验势函数,可进行与实际体系对应的分子动力学模拟,例如计算金属铝的晶格常数,或水的密度,得到与实验吻合的结果。另一方面也提供了多种模型势函数,可用于进行粗粒化模拟,例如模拟基于粒子-弹簧模型的高分子链的性质。 LAMMPS作为实用程序包,采取了很多成熟的优化算法。例如在短程相互作用的计算中运用韦尔莱表和元胞列表优化临近粒子的扫描。 用户可在下至个人电脑,上至计算机集群上运行LAMMPS。在并行环境下,LAMMPS使用空间分解技术,将整个模拟体系分解成若干个更小的体系传递给不同处理器执行,边界的处理则使用“幽灵原子”保证整体的连续。LAMM...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案