当前位置: 首页 > news >正文

[领域]Party/PartyRole/Classification及其它...

缘起:

Partechblog以及与“在别处”的讨论。

Classification pk Generalization

让我们回到旧的历史场景,蒙古人打进北京,建立元大都,汉族人对元政权嗤之以鼻,称其为“鞑子”;若干年后,满族人入关,定都北京,汉族人仍然不服,嚷着“反清复明”。关于这个历史场景,《中国哲学简史》上有着精彩的点评:“”

因此,当时的某一个人,因为对其的评价角度不同,使得他产生了裂变。我们用UML图表现出来,大约应该是这个样子。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"></shapetype><stroke joinstyle="miter"></stroke><formulas></formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f><lock v:ext="edit" aspectratio="t"></lock>

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以下”,“10003000”,“30016000”。。。

因此,最终用户实际想看到的分类结果,可能是这个样子:

标识

名称

分类

0001

PersonA

文化:华夏

种族:满族

收入:10003000

0002

PersonB

文化:狄夷

0003

PersonC

表格1 Type的实例

从上面的表中,我们可以看出:

1 一个人可能存在多种分类,也可能一个也。003没有任何分类,这是允许的,只不过是在统计的时候,可能会与某些人期望的不相符。

2 我们用这些分类,基本上是用来做统计用,很少去关心:“如果你是一个狄夷,那么我们就会。。。。”。因此,我们可以将Type压缩(扁化),只是简单记录之间的分类结果就行。

根据上面的数据,那么我们可以建立自己的数据模型:

3 数据模型的“分类”实体和“Type”实体。

值得注意的是,在PersonType表中,存放了所有的分类类型(不管是“文化”的,“种族”的,还是“收入类别”的。。。)

其实,在领域模型中,是否要出现对应于数据模型中的Type,有过很多的争论。要知道领域模型知识级别中的Type 和数据模型中的Type,是两个不尽相同的概念。

4 领域模型的PartyType

从理论上,我们很少在领域模型中看到对应数据模型的那个Type的出现。在领域模型中如果出现了Type,那么基本上就是建模者想让模型的约束力更强一些。也就是说:在领域模型中的Type,要么跟Rule相关,要么跟某些行为相关,更关注的是一种对操作层对象的装配和动态控制能力。我们从图4中,也可以看出。PartyPartyType是对多1的关系。而在数据模型中,Person实体和PersonType实体是多对多的关系,因此,出现了PersonClassification实体。

分离PartyRole

一个Person,在实际的业务环境中,可能会扮演多种角色(Role).Role其实是众多分类法中的一种分类而已,我们可以很容易的加上一种新的GeneralizationSet(或者多种),换句话说,Role是众多分类中的一个子集,因此,它也可能是多重分类(multiple classification)。不过,因为业务的需要,更加关注挖掘Role的附加信息而已。比方说,我们要关心在逃人员这类控制对象,我们要了解,该人员是什么时间被通缉的,所犯何事。这类信息,就是该角色特有的信息,因此,根据Peter Coad的《Color UML》中的建议,我们会把Role当成领域类来处理。

5 增加了“控制对象”泛化集,按Role进行分类。

Role领域对象提取出来,不能简单的了事。作为一个DDD的实践者,我们更希望把模型和实现相绑定,刚才扁平的Type实体的解决方案,就无法满足我们的要求了。我们还有以下的选择:

l 把各种Role分开成单独的类,都继承于Party。因为各种角色之间存在组合或者互斥的关系,我们就很难确定这些角色的扮演者是不是一个人,即使是把Role的对象彼此关联起来,那么还有数据冗余的要处理的难题。此外,还有,就是这个模型如果发生了改变(比方说增加了一个新的要关注Role,或者一个Role转变成另一个Role时),这个模型的实现逻辑就要改变。

l PartyRole变成一个抽象类,下面有若干的子类。(如图6)。需要注意的是,PartyRole的子类仍然存在组合或者互斥关系(比如 “客户”和“供应商”都既可能是组织角色,也可能是人员角色,而组织角色和人员角色之间是互斥的),不过要想在这个模型上加以限制,就比较容易了。同时,这个模型对动态分类的适应能力也比上面的那个方案强一些(其代价就是,模型比上面的模型复杂了些).

6 分离出来的PartyRole

如果想继续探讨PartyRole,我们就会发现:

l 有独立于关系的角色,也有依赖于关系(Relationship)的角色。独立于关系的角色,如:医生,公证员。依赖于关系的角色,如:雇员、学生。对于依赖于关系的Role,如果我们要记录其关系相关信息,那么就要把关系单独抽取出来(e.g .公司的某个客户,有3个销售人员与其有业务往来。A销售员跟这个客户特铁,因此,这个客户对A来说,是金牌客户;但是对C销售员来说,这个客户只能算是一般客户。金牌一般是针对关系而言的,不能放到Role中)。

l 有事务相关的角色,也有通用的角色。事务相关的角色,如:某个文档的作者,某次存款业务中的储户,某笔订单中的付款人。通用的角色,如:医生、客户等。。。。我们常把事务相关的角色,在数据权限(和业务逻辑)中处理。

RoleRelationship的表示法。

那么,我们在建领域模型的时候,应该怎么表示RoleRelationShip呢?有两种方案:

1 简化的做法:

图7 学生和老师 (用黄色表示是Role

2 较为抽象的做法:

图8 Person的自关联,在两端写角色 ,并注明关联的名称。

数据模型的实体定义:

下面是在数据模型中的实体概念定义,会帮助我们把数据模型和领域模型串起来,虽然其中还有些许差别。

l The PARTY entity defines the nature of the party,which will not change over time.

l The PARTY TYPE classifies the party into certain categories.

l The PARTY ROLE entity defines how a party acts or, in other words,what roles the party plays in the context of the enterprise's environments.

l The PARTY RELATIONSHIP entity allows parties to be related to other parties and maintains the respective roles in the relationship.The PARTY RELATIONSHIP entity has attributes of from date and thru date in order to show when the relationship started and optionally when(and if) it ended.

参考资料:

UML Distilled 3ed

The Data Model Resource Book

Domain-Driven Design.

相关文章:

  • librosa能量_音频特征(1):mfcc提取
  • 【解决】为什么网页都完全显示出来且打开了,状态栏左下角还显示正在打开网页...?...
  • cad 怎么显示块句柄_CAD制图软件中轮廓设置功能的使用技巧
  • aspose word html图片比例_【Web技术】661 在前端如何玩转 Word 文档
  • C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
  • python pymssql安装_Python安装-安装pymssql错误的解决办法
  • python 倒叙 数组_要想打好python基础,这68个内置函数一定要吃透
  • 我的写作进度之三-初稿完成
  • 提高抗打击能力_提高孩子的抗挫折能力
  • 终于,在面对一番质疑后,他们开始对言论进行控制了!
  • vscode 路径找文件插件_今天来安装一个骚气的 VS Code 主题
  • 里面的isactive什么意思_农村刻碑规矩繁多!一些墓碑上的常见字都是啥意思?读完您就懂...
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • CSDN F2F北京.NET程序人生研讨会活动报道
  • hostconfig.undeploy 正在取消部署_重要!市自然资源局紧急部署落实防御台风工作...
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • Android 控件背景颜色处理
  • canvas 高仿 Apple Watch 表盘
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分布式任务队列Celery
  • 基于axios的vue插件,让http请求更简单
  • 基于遗传算法的优化问题求解
  • 使用 Docker 部署 Spring Boot项目
  • 我与Jetbrains的这些年
  • 一些关于Rust在2019年的思考
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • # 安徽锐锋科技IDMS系统简介
  • (09)Hive——CTE 公共表达式
  • (1) caustics\
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (补)B+树一些思想
  • (分布式缓存)Redis分片集群
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .htaccess配置常用技巧
  • .net MySql
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • @Autowired 与@Resource的区别
  • [ SNOI 2013 ] Quare
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [Gamma]阶段测试报告
  • [gdc19]《战神4》中的全局光照技术
  • [HDU3710]Battle over Cities
  • [HDU5685]Problem A
  • [JavaWeb学习] idea新建web项目
  • [linux]--关于进程概念(上)