【架构思考】重构之拆分子项目实践

随着时间的推移,项目代码越来越多,文件结构越来越复杂。到了某一个时间点,必须做一些重构,拆分子项目,增加其可读性。

原项目文件结构

简化版的文件结构如下,这里将其做了分类:app_1, app_2, app_3。
实际的名字可能千奇百怪,很难从名字简单地判断其从属,阅读和修改起来非常困难。

Some_App
  src
    main
      java
        com.some.company
          app_1_a
            xxx.java
            xxx.java
          app_1_b
          app_1_c
          app_2_a
          app_2_b
          app_3_a
          ...

Approach 1 - Sub Module

第一种方案,是根据功能性将其拆分为一个个 sub module 。如下,拆分为了三个模块。每个子模块有自己的 pom.xml 。母项目有一个总的 pom 。

Some_App
  App_1
    src
    pom.xml
  App_2
    src
    pom.xml
  App_3
    src
    pom.xml
  pom.xml

优点:简单明了。

缺点:如果重构周期很长,保持 refactoring branch 和 dev branch 同步工作量非常大。

Approach 2 - Sub Branch

上一个方案最大的痛点是:难以同步!

假设,我在做重构时,同事也同时在做进一步的开发。由于拆分为子模块之后的文件路径发生了变化,所以并不能简单地使用 git merge 进行同步。而人工手动 merge code 繁琐且容易出错。
此外,我的重构工作可能要跨几个开发周期。在这期间段内不断地正确 sync 是一件挺困难的事。

经过一番思考与探索,我决定采用另一种策略:使用 sub branch 模式。

  • 为多个不同的子模块分别创建一个 branch: refactor_app_1, refactor_app_2, refactor_app_3。
  • 当处理 refactor_app_1 时,把其它的文件全删掉,只留与 App_1 相关的内容。当处理其它子模块时同理。
  • 总体上,文件路径不变,保证可以 git merge

文件结构如下:

branch: refactor_app_1

Some_App
  src
    main
      java
        com.some.company
          app_1_a
          app_1_b
          app_1_c
          ...

branch: refactor_app_2

Some_App
  src
    main
      java
        com.some.company
          app_2_a
          app_2_b
          ...

Sub Branch 功能升级

过程中,还发现一个问题,如果 App_1 和 App_2 全然没有交集,那很好。但是,如果有交集,都共用某一个模块,怎么办?

这里采取的做法是:

  • 对各个子项目总体分析一遍,提取出交集单独拆分为一个 sub branch ,比如 refactor_shared
  • 然后在 pom 里把 artifactId 名改了 publish 一下
  • 最后,每个子项目依赖于这个 shared_lib

PNG_3

IntelliJ IDEA 重构快捷键

工欲善其事必先利其器,Windows 版本的 IntelliJ 提供了如下快捷重构功能,非常好用!

  • 重命名(并修改所有引用) - Shift+F6
  • 更新方法签名(并修改所有引用) - Ctrl+F6
  • 提取方法 - Ctrl+Alt+M
  • 引入常量 - Ctrl+Alt+C
  • 引入变量 - Ctrl+Alt+V
  • 安全删除 - Alt+Delete

引用

posted @ 2021-08-17 20:31  MaxStack  阅读(4)  评论(0编辑  收藏  举报