老师好,还是想问下怎么区分通用子域和支撑子域
来源:2-7 确定系统最核心的部分:核心域和精炼

买买买
2022-02-14
老师好,还是想问下怎么区分通用子域和支撑子域,为什么在本节最后说商品和设备是通用子域,支付和用户是支撑子域呢?
1回答
-
尤达_技术咖啡
2022-02-14
你好,eric evans最早在《领域驱动设计:软件核心复杂性应对之道》这本书里只提到generic subdomain 和 core domain两种子域,其中generic subdomain应该翻译成“普通子域”,和“核心域”相对,代表重要性比较“普通”的子域。所以,我始终认为DDD里面实际上没有所谓“支撑子域”一说,大概率是后面其他人的附会。
为什么这么说?generic这个词又有“通用”的意思,所以很多地方把它翻译成“通用子域”,那么问题来了,既然翻译成了“通用子域”,是不是还有“不通用子域”?“不通用“的子域难道就一定是核心域?显然不是,所以出现了所谓“支撑子域”,既不是核心域,又不“通用”,那么就归到支撑域。。。。这对概念其实没有权威的明确的区分定义,Vaughn Vernon(《实现领域驱动设计》这本书的作者),在他的书里有提过一嘴,大致意思是“为多个子域提供服务的非核心域就是通用子域,否则就是支撑子域”,我个人觉得这种解释意义不大。
从实践意义来说,一般认为”通用子域“通用性较强(你的领域和其他领域都要解决的同一类问题,而且需求差别不大),意味着比较有可能直接用现存第三方成熟方案来解决;而“支撑子域”则仍然解决的是你的领域中某个方面的特定问题,只是重要性不如核心域,仅仅对核心域起到支撑作用,在面试过程中,如果有面试官问到,这是相对安全的答案。
我之所以把商品域和设备域分到通用子域,是因为认为商品域和设备域通用性较强,比较有可能通过第三方方案解决,而支付域这里比较微妙,正常情况下会认为它应该是通用子域,但是由于案例系统中支付域可能会需要处理一些业务流程中相对比较特殊的问题(比如退款过程中业务相关的特殊情况),所以先作为支撑子域。
再次重申,我个人认为区分“通用子域”和“支撑子域”没有意义(因为即便是“支撑子域”,集成第三方服务也不犯法),我只承认有“普通子域”和“核心域”的划分。课程里提到“通用子域”和支撑子域“的概念,目的是方便大家应对国内部分面试官的提问。
00
相似问题