移动应用遗留系统重构(4)- 分析篇

原创 DTO咨询师黄俊彬 ThoughtWorks CAC 敏捷教练 4月17日

前言

上一篇移动应用遗留系统重构(3)-示例篇我们介绍了CloudDisk的业务及代码现状。分享了“理想”(未来的架构设计)与“现实”(目前的代码现状),接下来在我们开始动手进行重构时,我们首先得知道往理想的设计架构演化,中间存在多少问题。一方面作为开始重构的输入,另外一方面我们有数据指标,也能更好评估工作量及衡量进度。

接下来我们将根据架构篇团队采用的架构设计,结合目前的代码,总结分析工具及方法。

架构设计

我们先回忆一下架构篇里团队采用的架构设计。

图片

  1. 代码复用

  • 公共能力复用,有一层专门统一管理应用公用的基础能力,如图片、网络、存储能力、安全等

  • 公用业务能力复用,有一层专门统一管理应用的业务通用组件,如分享、推送、登录等

 

  1. 低耦合

  • 业务模块间通过API方式依赖,不依赖具体的模块实现

  • 依赖方向清晰,上层模块依赖下层模块

 

  1. 并行研发

  • 业务模块支持独立编译调试

  • 业务模块独立发布

结合该4层架构、已有的代码,以及业务的后续演化,团队设计的新架构如下:

图片

分析工具

ArchUnit

有了架构设计后,我们就能识别代码的边界,这里我们可以通过Archunit进行边界约束描述。我们可以得到2条通用的守护规则。

  1. 垂直方向,下层模块不能反向依赖上层

  2. 横向方向,组件之间不能存在相互的依赖

转化为ArchUnit的测试用例如下:

图片

当然这个用例的执行是失败的,因为我们基本的包结构还没有调整。但有了架构守护测试用例,我们就可以逐步把代码移动到对应的Package中,直到守护用例运行通过为止。

接下来我们先运用IDE工具进行基础的包结构调整,调整后的结构如下:

图片

图片

调整后运行ArchUnit测试运行结果如下:

图片

这些异常的提示就是我们需要处理的异常依赖。但是ArchUnit的这个提示比较不不友好,接下来我们介绍另外一种分析异常依赖的方式,使用Intellij Dependencies 。

Intellij Dependencies

我们选择对应的Package,选择Analyze菜单,点击Dependencies,可以找出该Package所依赖的相关类。 

图片

我们选择dynamic Package进行分析后,发现根据现有的架构约束,存在横向的Bundle依赖需要进行解除依赖。

图片

在实际重构过程中,我们可以频繁借助该功能验证耦合解除情况,并且同时通过ArchUnit测试做好守护。

详细代码见Cloud Disk

总结

这一篇我们分享了如何借助工具进行异常依赖的分析。当我们有了未来的架构设计后,可以借助ArchUnit进行架构测试守护,通过Intellij的Dependendencies 我们可以方便以Package或者Class为单位进行依赖分析。

当我们已经分析出需要处理的异常依赖,接下来我们就可以逐步进行重构。下一篇,我们将给大家分享实践总结的一些重构套路,移动应用遗留系统重构(5)- 重构方法篇。

系列链接

移动应用遗留系统重构(1)- 开篇

移动应用遗留系统重构(2)-架构篇

移动应用遗留系统重构(3)-示例篇

Archunit:https://www.archunit.org/

Cloud Disk:https://github.com/junbin1011/CloudDisk/commit/d4b81762177b3a5e38d9d622170786540bcc7478

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值