数字市场法案|为什么用了 DDD 以后,代码更难懂了?( 三 )


战略设计Domain:领域 , 你们公司是干啥的 , 你都不知道吗?
Core Domain:你们公司的卖货的 , 那卖货就是你们与其它竞争对手的关键竞争环节 。 这就是核心域 , 就是核心业务 , 为啥聪明人都往核心业务挤?核心业务的汤也比边缘业务的饭好啊 。
SubDomain:你们公司的卖货的 , 但是用户没法付钱 , 那也没法干 , 支付就是子领域 。
Supporting Domain:你们公司是卖货的 , 但是客户想看一些指标 , 你总得有系统能支持吧?可能就是些写写 SQL 的系统 。 支持域 。
Generic Domain:你管你们公司干什么呢?员工的在职离职 , 工资发放总得有系统能支持吧 , 这些就是通用域 。
除了第一个 Domain, 其余四个 domain 重要性逐级递减 , 递减的意思是 , 如果公司要裁员 , 那是从下面往上面裁 。
前面我说有些程序员觉得 DDD 战略设计没用 , 你连自己所在的组 , 从事的工作职责对于公司来说重不重要都不清楚 , 那被裁的时候也别哭哦 。
统一语言:这个就更好理解了 , 比如跳水这个词 , 你说跳水的时候指的是这个:

而你同事说跳水的时候指的是这个:

这里你们聊的是工作 , 那说明你们一定不是在同一个上下文里工作 , 可能你们俩一个在体育赛事部门 , 另一个可能是在金融部门 ,DDD 认为可以用统一语言来进行领域划分工作 。 划分后在同一个上下文内 , 同一个名词大家说出来意思一致 。 这就是Bounded Context ,ain 。
既然拆分了 , 如果我们还在同一个 domain 内 , 那完成业务流程是需要协作的 , 这个不同 Context 的协作方式就叫Context Maps 或者 Integration Type 。
名词很恶心 , 但具体的方法就两种 , 两个微服务要么通过 RPC 通信 , 要么通过 MQ 通信 。
如果通过 RPC 通信 , 那 callee 一般是 caller 的爹 , 很多时候 callee 挂了是要影响 caller 的(当然也有熔断之类的方法避免一起死) 。
通过通过 MQ 通信 , 那上游一般是下游的爹 , 因为上游一个重构 , 下游们可能就都炸了 , 最终一致都是屁话 , 多少公司的最终一致都是靠人肉修的 。
这种爹和儿子的关系就是Conformist 。 如果爹能多考虑一下儿子的需求 , 那就是Customer-Supplier关系 , 毕竟顾客名义上还是上帝 。 如果跨系统有一些需要共享的定义 , 比如公司里的业务分类 , 可能大家都要从某个系统的 PHP 文件里解析出来在自己的系统里去用 , 那这时候可能得去使用别人的代码 , 这种叫Shared-Kernel , Kernel 一改 , 大家一起死 。
最后 , 有时候我们可以用一个叫 ACL 的东西拦住上游的一些修改对我们的业务逻辑侵入:
防腐层:Anti-Corruption-Layer , 就是我要把外部系统的变化拦截在对接层 , 不要让别人的屎甩到我身上 。
【数字市场法案|为什么用了 DDD 以后,代码更难懂了?】讲到这里 , 基本的概念我们已经都过一遍了 , 你要说 DDD 一点用处都没有 , 那我也是不同意的 , 至少看完了这些书 , 我知道去哪里能赚到更多的钱了 。