1. 演进式架构的核心思想中用适应度函数守护架构约束
演进式架构(Evolutionary Architecture)的核心思想是什么?如何用适应度函数(Fitness Function)来守护架构约束,既保证架构可演进又防止其退化?
- 演进式架构的定义(有指导的增量变更)
- 适应度函数作为"架构的可测试性"手段
- 在演进与约束之间保持平衡
演进式架构是一种支持有指导的(guided)、增量式架构变更的架构实践,其核心思想是"架构可以演进,但演进必须被约束和度量"。传统架构往往把约束写在文档里,一旦文档与代码脱节,约束就形同虚设。演进式架构主张把架构约束转化为可执行的、自动化的"适应度函数"(Fitness Function),即对系统某项架构属性进行客观度量的自动化测试或检查。这样架构约束就变成了 CI 流水线中的一道门禁,任何违反约束的提交都会被拦截,从而在允许架构持续演进的同时,守住不可突破的底线(如依赖方向、性能预算、技术栈约束)。其本质是把"架构治理"从人为审查变成可验证、可量化的工程纪律。
关键洞察在于"演进"与"约束"并不矛盾——约束不是阻止演进,而是确保演进有方向、可观测、可回滚。适应度函数让架构约束具备"可测试性",这正是演进式架构区别于传统"架构文档"治理的核心。它遵循"测试优先"的思想:先把约束固化成测试,再让重构驱动的演进在一个安全网内进行。
// 用 ArchUnit 把"禁止 layer 反向依赖"的架构约束固化为可执行测试
@AnalyzeClasses(packages = "com.example")
public class ArchitectureConformanceTest {
@ArchTest
static final ArchRule noControllerDependsOnRepository =
layeredArchitecture()
.consideringAllDependencies()
.layer("Controller").definedBy("..controller..")
.layer("Service").definedBy("..service..")
.layer("Repository").definedBy("..repository..")
.whereLayer("Controller").mayNotBeAccessedByAnyLayer()
.whereLayer("Repository").mayOnlyBeAccessedByLayers("Service");
}