重构(Refactoring)

近期正在做一个升级项目,将公司原有的老系统升级,在升级过程中遇到很多有意思的问题,正好近期有参加代码重构课程的培训特写此文章记录一些内容。

项目重构

关于项目重构,主要升级项目整体搭建架构,依赖包升级,基础框架升级等,为了保证项目顺利阶段性上线,项目需要分阶段升级,现在为第一阶段

工程Maven化,

此前项目为纯Java工程,Jar本地化,首要解决工程构建管理方式,决定采用Maven,此处几乎没有难点,需要注意的有:

  • 打包需要包含的文件,例如package中的xml文件,除class文件maven默认情况下将不会将其打入包内
  • maven引用本地jar包,由于此项目的历史原因,部分jar现在不再公司中央仓库中,所以先采用临时本地包的方式引入maven
  • 依赖包maven管理,注意依赖包的重复引用,排除多Jar版本等

基础架构升级

  • 升级相关Jar版本,并保证版本中的class依赖关系正确,遇到class废弃导致的依赖class消失等问题
  • 引入spring boot,以及相关组建包,JDBC ORM等
  • 替换原有web.xml,改为通过spring boot servlet注册方式实现
  • cxf servlet升级,解决mapping冲突等
  • 改变资源文件位置,整理配置文件,更改证书加载方式等

其他升级

  • 连接池升级,引入HikariCP链接池
  • 调整Hibernate配置属性,解决connection释放问题
  • 采用slf4j和logback实现方式整理log,导入原有log配置

目前,第一阶段进展顺利,基本不涉及代码改造,已经将整体框架进行了迁移

其中读到最有价值的文章是:Spring揭秘–寻找遗失的web.xml

另外还使用了spring boot中的actuator,用来做工程加载情况

再看重构

第一阶段进入尾声时,公司安排的 clean code培训,重点讲解了代码重构,时间点刚刚好。此次培训收获还是很多的,至少让我从更加系统和最佳实践方面了解了软件工程

重构应该分为两个层面:

  • 架构级重构 上面的项目重构第一阶段,可以说是架构级重构的一小部分,其更多是指对项目整体架构的调整升级,例如从单机变为集群、集群与分布式、引入容器化部署、使用消息中间件解藕等
  • 代码级重构 这个是此次培训的重点,其指导思想更多用于开发人员开发过程中,例如:模块合理划分、设计模式基本原则、降低代码复杂度、领域模型、代码解藕、TDD、DDD等

代码重构

此项目的第二阶段必然会涉及代码重构,但是能做多少现在还不确定
那么此次培训重点都有什么呢?

  • 从系统业务分析到功能开发设计,如何分解、拆分、思考,实现类关系图和时序图,这也是最关键的两个设计文档
  • 代码过长、箭头代码、代码复杂度过高问题解决思路 代码拆分、优化、实现可扩展
  • 基本原则,单一职责、扩展才继承、委让更为灵活,接口为了暴露
  • 代码自身解释原则,合理进行注释
  • 领域模型的价值,泛化类型带来的问题,避免数据泥潭
  • 编译时错误和运行时错误,不要”吃掉”异常
  • DDD TDD的最佳实现,有效单元测试设计和结对编程实践

以上这些内容具体处理方法,参考马丁 福勒(Martin Fowler)重构思想实现

结束语

要成为一名合格的软件开发工程师这些内容是我们应该熟知和掌握的,今天算是抛砖引玉,以后还要更多实践。

此外,一个团队中只有一两个人知道这个是不够的,需要通过合理的方式和工具使团队可以运用这些方法,实现整体能力提升才有价值。