系统老化与重构

Mar 7, 2020 12:00 · 1006 words · 3 minute read Architecture

架构老化源于什么?

在我们不断给系统添加各种新功能的时候,往往会遇到功能需求的实现方式不在当初框架的设定范围之内,于是很多功能代码逸出框架的范围之外。

代码老化的标志

添加功能越来越难,迭代效率降低,问题却持续不断,解决了一个问题却由此生出好几个问题。

怎么应对架构老化?

  • 该怎么重构系统,才能让我们的软件重新恢复活力?
  • 在重构系统之前,我们应该如何进行局部改善,如果增加新功能又应该如何考虑?

老系统添加新功能

让新功能的代码与既有系统解耦,能不依赖尽量不依赖。

**不依赖的核心含义是业务不依赖。**新功能的绝大部分代码独立于既有业务系统,只有少量桥接的代码是耦合的。

公司内部的依赖库需要辩证地看,基本的判断标准是成熟度越高的基础库越值得依赖。

做新功能的思路:尽可能与既有系统剥离,从独立业务视角去实现业务,抽象对环境的依赖。最后,用最少量的对接代码把整个系统串起来。

1. 架构的局部优化

目标是优化某个功能与核心系统的耦合关系。

1.1 重写/局部重构

从系统中彻底移除掉与该功能相关的代码,重新写一份新的。

局部重构一定要发生在你对这块代码的业务比较了解的情形,比如你已经维护过它一阵子了。另外,局部重构一定要把老代码清理干净,不要残留一些不必要的代码在系统里面。

1.2 依赖优化(将散落在系统中的代码集中起来)

依赖优化工作量小:

  • 做的是代码搬运,不改变任何业务逻辑。
  • 可以不必深入功能的细节,只需要找到该功能的所有相关代码,这是难点,然后把它们集中起来。

尽可能把我们认为非核心系统的功能,都基于依赖优化的方式独立出去。 这样核心系统与周边系统的耦合就理清楚了。

2. 核心系统重构(高风险)

确定要对核心系统进行重构,那么最高优先级是确定它的边界,也就是使用界面(接口)

周边系统对核心系统的依赖:

  • 核心系统的功能,表现为它提供的 DOM 接口
    • 让周边系统对它的依赖,变成依赖接口,而非依赖实现;
    • 审视核心系统功能的 DOM 接口的合理性,明确出我们期望的接口设计。
  • 核心系统提供的事件,让周边系统能够介入它的业务流程
    • 对所有周边模块进行依赖优化的整理,细加分析后可以初步确定核心系统需要暴露的事件集合。

最重要的是对核心系统的接口进行重新设计。

  • 我们对业务的理解的确有了长足的进步。
  • 对周边系统切换到新接口的成本有充足的预计。

实际上从难度来说,重构比一个全新业务的架构过程要难得多。重构,不只是一个架构的合理性问题。它包含了架构合理性的考量,因为我们需要知道未来在哪里,我们迭代方向在哪里。