缘起:
Partech的blog以及与“在别处”的讨论。
Classification pk Generalization:
让我们回到旧的历史场景,蒙古人打进北京,建立元大都,汉族人对元政权嗤之以鼻,称其为“鞑子”;若干年后,满族人入关,定都北京,汉族人仍然不服,嚷着“反清复明”。关于这个历史场景,《中国哲学简史》上有着精彩的点评:“”
因此,当时的某一个人,因为对其的评价角度不同,使得他产生了裂变。我们用UML图表现出来,大约应该是这个样子。
图1 不同的角度看待同一事物,即对事物的多重分类 (Multiple Classification).
注:在UML2.0中,称泛化箭头旁边的“文化”和“种族”,为泛化集(Generalization Set)。
分类指定一个对象和它的类型之间的关系(Classification refers to the relationship between an object and its type.)
这跟我们原来想像的继承关系有很大的差距,在大多数人的印象中,继承就应该是单支的,也就是说,一个对象最后终会属于一个类,现在出现的多重分类,破坏了大家的这种印象。很多人因次,放弃了这种方案的实现。
面对这个分析模型,我们真的要放弃吗?答案当然是否定的。
我们来看问题的本质:对给定的一个Person 类的实现,怎么让他同时具有华夏和蒙古族两种分类?我们需要转换思路,把图1中,所有的Class都看成是Interface,然后,写一个新的类,来实现所有的这些接口。
图2 一个真正的对象,实现并对外暴露了众多的接口,封装了复杂的内部逻辑。
这非常类似于com对象的实现。(感兴趣的朋友,可以查看COM规范中的IUnknown 接口之 QueryInterface方式的实现要求)
ThingType vs. Thing
在与需求人员交流后,我们又被告知,对一个人,需要添加新的分类标准:收入类别。按照一个人的月收入情况,可以分为 “1000以下”,“1000-3000”,“3001-6000”。。。
因此,最终用户实际想看到的分类结果,可能是这个样子: