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

简记一次项目重构

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

一、项目背景和重构背景

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

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

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

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

 

二、重构设计

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

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

大致流程如下:

1、分流

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

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

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

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

2、算法执行

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

3、结果判定

封装返回结果

 

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

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

 

三、发现问题

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

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

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

 

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

 

四、项目总结

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

个人经历:

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

个人觉得:

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

 

五、总结

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

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

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

 


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
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社区 版权所有