在代码库上设计和创建模块
在代码库上设计和创建模块
为什么我们需要以及如何在代码库中创建模块
在业务逻辑和其他功能分散的代码库上工作至少对软件开发人员来说是一个令人沮丧的情况。
模块 是一种在代码库中保持清洁和分离的解决方案,例如组织良好的产品仓库。
让我们深入了解模块
模块的特性
模块具有必须遵循的明确特征:
- 限界上下文 每个模块都有一个明确的有界上下文,封装了所有功能。例如一个模块 ** 用户** 作为有界上下文,将封装和公开用户的所有功能。
- 高凝聚力 具有明确定义的有界上下文的模块所有密切相关的代码都非常接近
- 低耦合 一个模块必须有很少或零依赖
- 高复用性 从本质上讲,模块被设计为可重用
- 信息隐藏 模块必须只公开必要的信息并隐藏消费者不需要的所有其他数据
- 更少的重构和迁移工作 在我们需要重构或需要迁移模块的情况下,会更容易,因为所有消费者-客户端都依赖于模块接口
Code Base With Modules
接口和模型一致性
每个模块都必须公开一堆不同的类、函数和数据(模型)。
这些功能和模型是其他模块将使用并与之交互的稳定合约。
所有内部逻辑都必须被封装和隐藏。
最佳实践是使用接口公开所有模块功能,并且所有消费者都将与之交互。
这种方法被称为 依赖倒置原则(DIP) .
使用 DIP,我们可以创建松散耦合的模块
Modules with DIP
例如,在上面的图片情况下,如果 博客模块 需要获取信息 用户 博客模块不知道用户数据的位置和检索方式。结果是我们消除了两个模块之间的数据和实现逻辑耦合。
结构化
我们可以通过 3 个步骤构建一个结构良好的模块:
- 创建将公开所有模块功能的主界面
- 创建接口后面的所有模块内部逻辑
- 创建数据存储(数据库访问、HTTP请求、IO操作等),数据存储在模块之间必须是独立的
Structure of a Module
模块之间的通信
同步
模块之间的同步通信是当一个 模块-a
直接调用一个函数 模块-b
Sync Communication of modules
异步
模块之间的异步通信是指模块与事件和发布-订阅系统(又名消息总线)进行通信。
发布-订阅系统可以是:
- 内置在代码库中
- 使用 Redis、Kafka、RabbitMQ 等进程外系统实现
Async Communication of modules
模块类型
我们可以有两种类型的模块:
- 域基础模块 这些类型的模块提供业务逻辑并支持所有领域用例
- 基础设施模块 这些类型的模块没有任何业务逻辑,并且支持所有的应用程序操作
Module Types
在代码库上使用模块的好处
✅ 更干净的架构
✅ 更高的 DX
✅ 代码基础级别的高内聚
✅ 代码基础级别的低耦合
✅ 更容易重构功能
✅ 更容易迁移到微服务架构
✅ 关注点分离——单一职责
✅ 在模块级别封装故障
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明