本次翻译的是five.agency.android的博客文章。
The Clean Architecture Diagram
- Clean Architecture的功能设计:
- Dependency rule
- Abstraction
- Communication between layers
I. Dependency rule
三个在红色框框内的箭头表示依赖:
- 外层可以访问内层。
- 内层不能访问外层。
- 内层包含了业务逻辑,外层包含了实现的细节。
没人能阻止一个不知道或者不遵循此条规则的人,所以需要利用一些技巧来保证所有的操作safety!
比如Android中的Module dependencies构建依赖规则,其中的implemente还以保证不能跨层访问。
II. Abstraction
一句话:内层是抽象的,外层是具体的。
一个例子将之说清楚。
- 我们可以将抽象接口定义为“ Notifications”,并将其放在内部层中。
- 这样,您的业务逻辑便可以使用它在需要时向用户显示通知。
- 另一方面,在外层,实现该接口:该实现使用Android通知管理器显示通知。
当将 Abstraction 和 Dependency rule 结合使用时,使用通知的抽象业务逻辑既看不到也不知道使用Android通知管理器的具体实现,继而甚至可以切换具体的实现而不被业务逻辑感知。
III. Communication between layers
我们需要当业务逻辑,也就是内层设计位于数据流之间时的解决方案。
举个例子,业务逻辑如何将从 Internet 获取的数据呈现在 UI 上?
Internet细节和UI细节位于外层,业务逻辑位于内层,根据 Dependency rule 规则,业务逻辑不能访问外层,只能访问自己。如何设计?
like this:
图的主要部分上的箭头代表组成和继承,由实心箭头表示的组合,继承为空箭头,组合也称为has-a关系,而继承is-a关系。
- Controller持有一个Use Case Input Port,实际上是对其具体实现的引用。
- Use Case实现了Use Case Input Port(在同一层)
- Use Case持有一个Use Case Output Port,实际上是对其具体实现的引用(在同一层)。
- Presenter实现了Use Case Output Port。
总之,通过组合和继承,我们可以实现数据双向流动,这就是层与层之间的通信。