对领域驱动设计的初步认识(八)

10-12-14 flyzb
    真有意思,讨论DDD了这么久,我们竟然连第一个D——“领域”的含义都没有达成一致。的确,Eric也没有明确地告诉我们。下面我谈谈自己的想法。

    首先我们要明白“业务”和“领域”的关系。它们是不同的,“业务”是指用户的业务范围和目标,是宏观范畴的,而且往往是复杂的、动态的和经常变化的,也就是说是“业务是客观存在”。“领域”是一种人们对业务的主观认识,“领域驱动设计”是一种业务分析方法。人类认识复杂的事物,往往采取分而治之的策略,选取一定的角度把一块业务抽取出来而形成“领域”。所以说“领域”是有边界的,而且是比较稳定的。

    在理想情况下,业务内部不同的“领域”相互独立,这些领域一起协作来完成整个业务功能。如下图所示:

理想的领域

。比如人员、权限、帖子就属于不同的领域。

    其实上面的情况只是理想情况或者单一的局部业务,而实际复杂场景会出现如下情况:

实际领域

这也就是说“领域”之间会出现交叉。因为“领域”不是业务的全部,而是业务不同角度的抽取,所以必然会出现交叉。大家注意,其中交叉部分中的“蓝色小块”就是基本核心对象是共同的。比如以“产品”为例,我们可以从研发、生产、维修等多个维度抽出多个领域模型,而大家会发现“产品结构”是他们共同的部分。

    业务变化了,准确来讲,不是原有的领域的边界变了,而是需要增加新的领域。而更复杂的情况是,新的领域和原来的领域是有交叉的。从“论坛”变为“SNS”的过程中,“论坛”本身并没有变,因为单一用户的业务需求是成长的,同时不同用户的需求也是有差别的,“论坛”不适合这个用户但还可能适合其他用户,所以说“论坛”是稳固也是没错的。但对于不断成长的用户,“jive论坛”可能不满足需求了,需要一种新的“JdonSNS”的领域。在这个新的领域里,“发帖和回帖”作为交叉部分可能仍然需要保留,但可能会赋予一种新的业务场景。

    有一句话,“业务本来就是集成的,根本就没有信息孤岛”,而那些所谓的“孤岛”都是我们这些做信息化的通过不同的业务切分弄出来的。从企业的整体业务看,各种“领域”会发生大量的交叉。而这种复杂性,我们只能从一个一个系统开始,然后再做集成,可是集成的领域建模应该怎么做一直是个困扰的难题。

    DDD的方向没问题,但目前的认识还有局限。在企业的复杂场景下,应该如何进行DDD建模一直是我思考的问题。前面的帖子里我提出一种观点——“向自然学习”,拿我们最熟悉的人体为例,人体细胞可以完成多种复杂的“场景(领域)”而靠的就是类似于“神经传导”。所以我一直建议弱化领域边界,强化“对象间的神经传导”,希望以此通过学习自然的方式来解决复杂业务场景下的DDD建模的适应性问题。

[该贴被flyzb于2010-12-14 23:26修改过]

         

6
SpeedVan
2010-12-15 02:46
个人理解:已经存在,却不知道(没有了解清楚,或者误解),就构成内部不稳定;原来不存在的,额外增加的,则构成边界不稳定了。内部不稳定,我们已经有不少办法解决得很好。而论坛重构成一个大型的SNS的话,就是一种边界不稳定。原来的设计是根据原来的领域,所以过大的边界改动,会引起领域变质,而重构的成本就可能很大了(干脆重新弄个)。

可能banq的想法是,扩展前后是两个领域,所以领域一直是相对稳定的;而我的想法是,从原领域扩展为新领域,这种变化就导致不稳定的领域了(这就是我认为领域一词不带有稳定的原因)。感觉这两种想法也是可行的吧。

而对于场景,个人认为是一个细化后的领域,也就是存在单一稳定的交互领域。DDD讲究一个整体领域,若果分开场景(领域)考虑的话,DCI。其实我有这样想法的,若果把以DDD中的领域集合起来时,是以消息的方式,而DCI中的场景不是也是这样吗?

banq
2010-12-15 09:34
领域的最主要特征是:高凝聚;而凝聚本身的含义是相对稳定。

冰块的例子非常典型,液体变成固定后,凝聚力强,水从无边无形的液体变成了有边有角的冰块,自然冰块周围就形成了边界。

数学上喜欢用“四边形”等符合来表示边,其实现实世界中是找不到真正“四边形”的,因为是人看到相对稳定的冰块四周形成了立体“四边形”,所以才认为冰块是有边的。

推导过程:高凝聚(相对稳定) ===> 边界 ====>领域。

算法也是一种领域,因为算法是依靠数学公式凝聚在一起,1+1=2就把两个1和一个2相对稳定凝聚在一起,形成一个事物,如果我们深入这个事物,就是进入其领域。

量力力学说了:电风扇如果以光速转动,就成为铁板一块,内部因子接近光速的运行,可改变其内部稳定性,改变其凝聚性,从而改变事物,这时的电风扇就不能叫电风扇了。

JiveJdon是以帖子为核心模型的论坛领域的软件,如果需求变为SNS,SNS我们都知道是以人交往为核心模型的社区领域,核心变了,这能叫拓展吗?电风扇已经变成铁块;水已经变成冰块了啊。

楼主最后一张图指出有两个领域可以共用交叉,这是客观世界中不存在的,这是人自以为聪明思考的结果。

儿科和内科两个领域都看发烧,人经过思考活动后,认为发烧有共同特征,可以合并,但是两个医生都学了治疗发烧课程后,分别到儿科和内科做医生,还是发现有其领域的不一样东西。

这里我不否认人类抽象合并的作用,但是别被这个混淆了你看世界的清澈度。世界是由各自高内聚性的事物组成。如果是动物,看不出他们之间共同点,只有人类才看到这些内聚性的共同特征,试图概况他们,最后是庸人自扰了哦,自己给自己套上烦恼绳索。

所以,什么“新的领域和原来的领域是有交叉的”都是人主观糊涂的产物,现实中领域之间边界很清楚。

大道无边,反者道之动,大道没有边,而道运动本质是反动的,那么无边的反面是有边,就是提醒大家,牢牢看清世界,世界任何事物是有边界的,不要自己迷惑自己,人迷惑人,有句话,鬼是没有,就怕人装鬼。

哈哈,谈得比较多,希望对大家有益,也别中毒啊,哈哈。

xuzhh
2010-12-15 11:04
2010年12月15日 09:34 "banq"的内容
JiveJdon是以帖子为核心模型的论坛领域的软件,如果需求变为SNS,SNS我们都知道是以人交往为核心模型的社区领域 ...

为什么以帖子为核心模型是稳定的,而以需求为核心模型是不稳定的呢?

flyzb
2010-12-15 11:16
    我的观点是“不要把业务领域等同”。“业务”是客观存在,“领域”是主观认识。

    我们总是在说“领域是高内聚的”,但往往忽视“为什么”。“领域的高内聚”是因为“业务”。冰为什么会变成水,是因为“业务”变了——水分子间的作用力变了。按此也同样能解释关于上面电风扇的例子。

    关于“论坛——SNS”的问题,同样应该分清“业务和领域”的关系。我们可以回顾一下“论坛”的发展历史,它原本就是一个“交流平台”,这就是“论坛”的业务本质。而“SNS”也是一种“交流平台”。从业务本质上来讲,“论坛”和“SNS”并没有区别;当然它们的业务内涵仍然是有区别的。

    再说“儿科”和“内科”。儿科和内科只是西医对医学的一种划分方法。我不是医学的领域专家,但仍然知道西医里还有“跨学科”和“多学科融合”的说法。从传统中医的角度来讲,是不分什么“儿科”和内科的。从病人的角度来讲,只是需要一个“看病系统”而已。从文明发展角度来讲,人类的将来或者发达的外星文明会有一种统一的治病手段。所以千万不要让“领域”迷惑了眼睛,要记住是“业务决定领域,领域服务业务”。

    对于企业,让我们反思一下,那些信息孤岛是怎么弄出来的,就是我们从片面的角度分割业务弄出了一大堆孤岛式的系统。比如要做一个“企业个人任务管理系统”,突然发现不能新做一个,因为在原有的大量的业务系统里面已经有了各种各样的个人任务,我们必须把这些任务集中到一起才能形成一个企业完整的“企业个人任务管理系统”。这就是上面我说的领域融合交叉的问题。

    呵呵,banq别激动,我们继续讨论。

猜你喜欢
5Go 1 2 3 4 ... 5 下一页