热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

简记一次项目重构

一、项目背景和重构背景背景:原项目的主要包含一个近2000行的service。公司最近变动较大,前段时间,一个同事离职了,交接给我们一个司机排序相关的项目。输入是:订单和司机列表。服务根据订单

一、项目背景和重构背景

背景:原项目的主要包含一个近2000行的service。

公司最近变动较大,前段时间,一个同事离职了,交接给我们一个司机排序相关的项目。输入是:订单和司机列表。服务根据订单的特定状态,采取多个不同的策略对这批司机进行组合排序。

其实在数个月前,我尝试过对这个项目进行重构,当时不懂业务,挣扎了一周左右,代码看的头晕,一个参数从入口一直用到了出口,有的参数在半道上产生,跨越了几百行代码之后被使用了。单测无法写,先抽离了一部分工具类,但是感觉对整个类改善不大,最终放弃了。

大概两周前,领导发话,要重构这个服务,还组织了几次评审。目标明确:就是要重构,集成到另一个服务里面,把原服务下掉。

 

二、重构设计

我虽然工作了这么多年,大大小小的项目也经历过,但是完全重构一个项目的事情没有做太多。设计模式挨个看了一遍,感觉用不上。最后重构时对自己的要求就是:封装变化。

我根据之前的几次评审,画了大致的流程图,写了大体的思路,进行了组内评审,没发现什么大问题。

大致流程如下:

1、分流

分流内部需要开发人员自己修改,这块主要逻辑是:根据订单特定参数选取特定的算法。

算法:包括多个策略,以及各个策略的打分权重。

策略:最小执行单元。需实现指定的策略接口,如果需要其他策略的数据,可以通过“session”进行交互。

关于“session”:看了ThreadLocal的实现,感觉弱引用可能存在线程执行过程中数据被GC清理的情况,于是自己实现了一个类ThreadLocal。后来又看了大量文章,发现是自己对GC理解的不够深刻。

2、算法执行

根据分流获取到的算法,按约定顺序执行包含的各个策略,并更新最终得分。

3、结果判定

封装返回结果

 

按照以上流程,开发人员添加算法时,需要:1、开发自己的策略,2、然后手动封装一个算法集,3、在分流阶段增加自己的判定分支

整个流程框架写完之后,由另一个对业务很熟的同事W开发了策略、算法、结果判定。项目完成之后,同事W进行了一次串讲。

 

三、发现问题

串讲的时候,我才发现,对于结果判定这块没有太多设计,之前设计时觉得这块是固定流程。

听流程发现,有的策略依赖之前所有的策略的总结果。按照当前的设计,只有所有策略执行结束时才会进行结果汇总。

因为同事W工程能力很强,直接修改了“结果判定”这块的流程,也正是因为此处,我才发现这个问题(相当于框架被改了)。。

 

后期改进:让策略在执行中能够获取到结果汇总。“结果判定”应该让算法开发人员自己来判定。

 

四、项目总结

对于这次的重构, 整体结果是可以接受的。开发一周半,测试不到两周,重构了一个累计开发了两年的项目来说,个人感觉是很好了。

个人经历:

封装变化,是为了把变化的权限掌握在自己手里。需要时可以从大局整体改变项目结构,而不影响太多框架的使用者。

个人觉得:

一个项目,开发者关注的代码越少,涉及改动的类越少,越不容易出错。该强制的就强制,编码不能太自由(约定优于配置)

 

五、总结

1、在不够了解业务的前提进行重构,进行架构设计,风险较高。

2、在设计开始之前,应该充分讨论业务场景。(幸好这次重构漏掉的不多)

3、新项目完成之后,进行流程串讲是有必要的。

 


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 探讨架构师在项目中应如何平衡对产品的关注和对团队成员的关注,以实现最佳的开发成果。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
author-avatar
喏焿你一辈子_997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有