对领域驱动设计的初步认识(八)
真有意思,讨论DDD了这么久,我们竟然连第一个D——“领域”的含义都没有达成一致。的确,Eric也没有明确地告诉我们。下面我谈谈自己的想法。
首先我们要明白“业务”和“领域”的关系。它们是不同的,“业务”是指用户的业务范围和目标,是宏观范畴的,而且往往是复杂的、动态的和经常变化的,也就是说是“业务是客观存在”。“领域”是一种人们对业务的主观认识,“领域驱动设计”是一种业务分析方法。人类认识复杂的事物,往往采取分而治之的策略,选取一定的角度把一块业务抽取出来而形成“领域”。所以说“领域”是有边界的,而且是比较稳定的。
在理想情况下,业务内部不同的“领域”相互独立,这些领域一起协作来完成整个业务功能。如下图所示:
其实上面的情况只是理想情况或者单一的局部业务,而实际复杂场景会出现如下情况: 这也就是说“领域”之间会出现交叉。因为“领域”不是业务的全部,而是业务不同角度的抽取,所以必然会出现交叉。大家注意,其中交叉部分中的“蓝色小块”就是基本核心对象是共同的。比如以“产品”为例,我们可以从研发、生产、维修等多个维度抽出多个领域模型,而大家会发现“产品结构”是他们共同的部分。
业务变化了,准确来讲,不是原有的领域的边界变了,而是需要增加新的领域。而更复杂的情况是,新的领域和原来的领域是有交叉的。从“论坛”变为“SNS”的过程中,“论坛”本身并没有变,因为单一用户的业务需求是成长的,同时不同用户的需求也是有差别的,“论坛”不适合这个用户但还可能适合其他用户,所以说“论坛”是稳固也是没错的。但对于不断成长的用户,“jive论坛”可能不满足需求了,需要一种新的“JdonSNS”的领域。在这个新的领域里,“发帖和回帖”作为交叉部分可能仍然需要保留,但可能会赋予一种新的业务场景。
有一句话,“业务本来就是集成的,根本就没有信息孤岛”,而那些所谓的“孤岛”都是我们这些做信息化的通过不同的业务切分弄出来的。从企业的整体业务看,各种“领域”会发生大量的交叉。而这种复杂性,我们只能从一个一个系统开始,然后再做集成,可是集成的领域建模应该怎么做一直是个困扰的难题。
DDD的方向没问题,但目前的认识还有局限。在企业的复杂场景下,应该如何进行DDD建模一直是我思考的问题。前面的帖子里我提出一种观点——“向自然学习”,拿我们最熟悉的人体为例,人体细胞可以完成多种复杂的“场景(领域)”而靠的就是类似于“神经传导”。所以我一直建议弱化领域边界,强化“对象间的神经传导”,希望以此通过学习自然的方式来解决复杂业务场景下的DDD建模的适应性问题。
[该贴被flyzb于2010-12-14 23:26修改过]