DDD领域驱动设计批评文集
做强化自测题获得“软件方法建模师”称号
《软件方法》各章合集
(匿) 2024-9-3 15:02
老师,我也经常遇到这样的困惑,领域概念应该提炼到什么层次,像京酱肉丝什么条件下可以定成子类,什么条件下是实例?
UMLChina潘加宇
(补注:问题的图来自《京东云开发者DDD妙文欣赏(1-4合集》)
这个问题还真不好答。其实,只要基本教育过关,不断训练出来的逻辑思维应该已经接近于本能,根本不用专门花时间去斟酌这个。如果这个地方老是被卡住,那问题就不只是面向对象建模或UML那么简单了。
既然是问“领域概念应该提炼到什么层次”,首先要了解“概念”代表了从很多很多具体实例中归纳出来的共性。
像乘数、乘法、交换律是概念,下面这个就不是,因为要是乐意可以搞出无穷多个来,1×10,1×11……
“人有姓名”是概念,“(注意看,)这个男人叫小帅”不是,因为如果愿意,还可以有“这个女人叫小美”,“这个男人叫大壮”,“这个女人叫有容”……
关于“京酱肉丝什么条件下可以定成子类”,先纠正一个用词。不是定成“子类”,是定成“类”。子类只是某个类在类关系中扮演的一个角色。B在和A的关系中扮演子类,但B可能在和C的关系中扮演超类,或者是扮演D的属性的类型。
如果要把某个东西定义成一个类,这个类得有自己特有的属性或操作吧?
下面是一个关于京酱肉丝的图片:
京酱肉丝有什么属性?中文名?口味?食材?剁椒鱼头、红烧茄子也有的。中文名、口味是菜品的属性,京酱肉丝特有的只是属性的值。
有的同学可能会有这样的问题:
假设系统要跟踪餐馆里出品的每一份京酱肉丝,看看里面的猪里脊真实质量多少(精确到微克),甜面酱真实质量多少(精确到微克),那么是不是就可以把京酱肉丝图片右侧的猪里脊等变成属性,把京酱肉丝变成一个类呢?
也不行,首先,这个时候关心的不是食材是什么,而是食材的真实质量,这两个不是一个东西。另外,同上,这不是京酱肉丝特有的,真正的概念是类似下面的内容:
那什么时候京酱肉丝可以成为一个类?
就是它是一个“类”的时候——这不废话嘛!实际上是说它像“面”、“咖啡”一样,成为一个类别的时候,就可以建模成一个类了。注意,是可以,但不一定要这样做。
这是有可能的。像“可乐”,一开始指的是一种叫“可口可乐”的饮料。此时,饮料才是“类”,可口可乐只是饮料的一个实例。后来跟随者越来越多,人们大脑里逐渐建立起这样的概念:那种黑褐色的、味道是那样的糖水就叫“可乐”,“可乐”就可以变成一个类。