架构设计的domain,model到底是什么

其实很久很久以前就有这么一个疑问,Domain 和 Model 到底是什么东西,它们经常一起出现, 为什么使用这个单词?在准备深入研读The Clean Architecture之前,我决定把它彻底的弄明白。

在几年前看 Android 的 CleanArchitecture 时第一次接触这两个词(架构意义上)。我笼统的认为它指的是业务逻辑(Business Logic),现在看来这其实没有理解错误。但是对于 Model 的理解就出现了稍微的偏差,我认为它是 “模块” (module),而不是 “模型”。

Domain Logic

Android clean architecture

在看到上面的图片后,我第一次认识到了domain 其实指的是 domain logic,难怪以前在搜索 domain 时找不到想要的答案。

Domain Logic 和 Business Logic(业务逻辑) 很多情况下指的是同一个东西。我在Stackoverflow上查到这么一个问答:What is domain logic?,它说明了Domain Logic 和 Business Logic 的关系。

The domain is what you are modelling. domain是你正在建模的东西。

If you are modelling a business problem, they are the same thing. 如果你正在为一个商业问题建模,它们是同一件事。

If you are modelling something else, physics for instance, there is probably no business logic in your system, but the physics parts are still domain logic. 如果你在为其他东西建模,例如物理学,你的系统中可能没有业务逻辑,但物理学部分仍然是领域逻辑。

简单来说就是Business Logic 就是 Domain Logic,但反过来就不一定是。

Model

在知道 domain 的含义之后,model的含义也就豁然开朗了。domain 指的是正在建模的东西,那么 model 不就是这个“东西”吗,就是模型啊。

简单来说就是 Model 指的是一系列具体的 domain logic 或者说 business logic。

Entity

而 Entity 从 The Clean Architecture 这篇文章中就可以很容易的得到答案。

实体就是 Model 中的具体的业务对象。是domain logic 和外部机构进行沟通的主要业务对象。也可以是关注点分离中的一个“关注点”。

Repository

在 Clean Architecture 的实践中(例如Android-CleanArchitecture),会看到这样的分层结构:

Android clean architecture layers

Google 官方出品的 Android架构蓝图 也大体是这样的分层结构。

它们的 Model 层设计高度一致,数据的读写都是包含在名为 Repository 的对象中。再次仔细观察上图后我发现 Repository Pattern 这个关键点,才知道原来这是一种设计模式。

搜索一番后发现这篇文章:存储库模式(Repository Pattern)

Repository pattern

好家伙,我一直笼统的以为 Repository 其实就是 Model 的另一种称呼,这理解偏差也太大了。Repository pattern 看起来非常简单,这里就不作赘述了。

Clean architecture

Repository 在上述Clean架构的实现中都属于 Data 层,那么这个Data 层属于哪个圈?

毫无疑问是绿色圈,是Interface Adapters, domain 需要利用Database 或者 Web (最外层蓝色圈)存取实体。

Android 中的 Clean 架构实现

具体看Architecting Android...Reloaded.这篇文章,我认为描述的已经非常详细了,特别是这几张图片。

Android clean architecture

Pasted image 20211017171802

Pasted image 20211017172324