【架构思考】重构之拆分子项目实践
随着时间的推移,项目代码越来越多,文件结构越来越复杂。到了某一个时间点,必须做一些重构,拆分子项目,增加其可读性。
原项目文件结构
简化版的文件结构如下,这里将其做了分类: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
IntelliJ IDEA 重构快捷键
工欲善其事必先利其器,Windows 版本的 IntelliJ 提供了如下快捷重构功能,非常好用!
- 重命名(并修改所有引用) - Shift+F6
- 更新方法签名(并修改所有引用) - Ctrl+F6
- 提取方法 - Ctrl+Alt+M
- 引入常量 - Ctrl+Alt+C
- 引入变量 - Ctrl+Alt+V
- 安全删除 - Alt+Delete
引用
- 参考1:IntelliJ IDEA 中的日常重构技巧 https://blog.jetbrains.com/zh-hans/idea/2020/09/intellij-idea
- 参考3:IntelliJ 重构经验谈 https://blog.csdn.net/weixin_28745309/article/details/113079671
- 参考2:IntelliJ 快捷键 https://www.huaweicloud.com/articles/1dde3026e1032ac1877d55266fdfdd78.html