按照这个规则,内层的模块或组件不应该直接依赖于外层的模块或组件 。只有外层可以通过依赖来访问内层的功能 。这种依赖关系的限制可以帮助我们保持代码的可维护性和灵活性 。同时,它也确保了系统的高内聚性和低耦合性 。
通过遵循依赖规则,我们可以更好地组织和管理代码,使其更易于测试、扩展和重用 。此外,它还能够促进团队协作,因为每个层次可以独立开发和演化,而无需过多关注其他层次的具体实现 。
文章插图
只有外层可以依赖内层
有时这条规则可能会被违反,尽管最好不要滥用它 。例如,有时在域中使用一些“类似库”的代码很方便,即使不应该存在依赖关系 。
不受控制的依赖方向可能会导致代码复杂且混乱 。例如,违反依赖性规则可能会导致:
- 循环依赖,其中模块A依赖于B,B依赖于C,C又依赖于A 。
- 测试可测试性差,需要模拟整个系统来测试一个小部分 。
- 耦合度过高,因此模块之间的交互脆弱 。
整洁架构的优点整洁架构的优点主要体现在以下方面 。
领域独立性主要应用功能被隔离并集中在一个地方,即领域层 。
领域层的功能相互独立,这意味着更容易进行测试 。模块的依赖越少,测试所需的基础设施、模拟和存根就越少 。
独立的领域层也更容易根据业务预期进行测试 。这有助于新开发人员理解应用程序应该做什么 。此外,独立的领域层有助于更快地查找从业务语言到编程语言的"转换"中的错误和不准确之处 。
独立的用例应用场景和使用案例分别进行描述,它们决定了我们需要哪些第三方服务 。使外部世界适应我们的需要 。这让我们可以更自由地选择第三方服务 。例如,如果当前的支付系统开始收费过高,可以快速更改支付系统 。
用例的代码也变得扁平化、可测试和可扩展 。
可替代的第三方服务由于适配器的存在,外部服务变得可替换 。只要不改变接口,那么实现该接口的外部服务可以是任意一个 。
这样就为更改传播设置了障碍:其他人代码的更改不会直接影响自己的代码 。适配器还限制了应用运行时中错误的传播 。
整洁架构的成本整洁架构除了好处之外,也有一些成本需要考虑 。
时间成本主要的成本是时间 。它不仅需要设计的时间,还需要实现的时间,因为直接调用第三方服务比编写适配器要简单得多 。事先完全思考系统所有模块的交互是困难的,因为我们可能无法预先了解所有的需求和限制 。在设计过程中,需要考虑系统如何可能会变化,并留出扩展的余地 。
有时过于冗长一般来说,整洁架构的规范实现并不总是方便,有时甚至是有害的 。如果项目很小,完全实现整洁架构可能会过度复杂,增加新人入门的门槛 。
为了在预算或截止日期内完成项目,可能需要进行设计上的妥协 。
增加代码量前端特有的一个问题是,整洁架构会增加最终包中的代码量 。我们提供给浏览器的代码越多,它需要下载、解析和解释的代码就越多 。
我们需要关注代码量,并且需要决策何处进行简化:
- 也许可以简化用例的描述;
- 也许可以直接从适配器中访问领域功能,绕过用例;
- 也许需要调整代码拆分等 。
因此,可以在一段时间内整洁架构的某些方面持保留态度,这没有任何问题 。但是,以下两个方面是绝对值得投入的最低资源 。
提取领域逻辑提取领域逻辑有助于理解正在设计的内容以及它应该如何工作 。提取领域逻辑使新开发人员更容易理解应用、实体及其之间的关系 。
即使跳过其他层次,仍然可以更轻松地处理和重构未分散在代码库中的提取的领域逻辑 。其他层次可以根据需要添加 。
遵循依赖规则第二个不可丢弃的规则是依赖关系的规则,或者更确切地说,它们的方向 。外部服务必须适应我们的需求 。
推荐阅读
- 三层软件架构导致程序员负担翻倍?
- JSX是Vue前端开发的未来吗?
- 系统架构设计之数据同步策略
- 苹果开源FastViT:快速卷积Transformer的混合视觉架构
- 6种流行的前端开发语言
- 今天来聊一聊结构化偏置的神经网络架构
- 编写整洁 Java 代码的最佳实践
- 三种可视化方法帮助您轻松理解Docker Compose架构
- 微服务架构
- 什么是多运行时架构?