首页 > 其他分享 >《软件方法(下)》8.3.4.3 关于“整体-部分”结构

《软件方法(下)》8.3.4.3 关于“整体-部分”结构

时间:2024-05-26 10:30:33浏览次数:14  
标签:8.3 聚合 4.3 组合 对象 微信 整体 关联 软件

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


8.3 建模步骤C-2 识别类的关系

8.3.4 识别关联关系

8.3.4.2 关联的进一步细分

是否进一步细分各种关联,各种面向对象方法学观点不同。有的认为关联就是关联,不用再细分,有的则认为需要进一步细分。

例如,James J. Odell就把聚合分为6种并详细讨论,如图8-122。

图片

图8-122 摘自Journal Of Object-Oriented Programming Vol 5, No 8. , James J. Odell , 1994

UML规范采取的是中间路线,把关联分为三种:普通关联、聚合(Aggregation)和组合(Composition)。

用图形表示,普通关联是一根直线,聚合有一端是空心菱形,组合有一端是实心菱形,如图8-123。

图片

图8-123 UML三种关联的图示

在UML元模型中,把它们视为属于三个不同的AggregationKind,如图8-124。

图片

图8-124 三个AggregationKind

从元模型上看,“聚合”应该叫作“分享型聚合”,“组合”应该叫作“组合型聚合”,但本书还是使用“聚合”、“组合”,原因阅读后文自知。

聚合和组合都表示“整体-部分”关联,在类图中,菱形一端表示整体,另一端表示部分。

相对于聚合,组合还有两条额外的约束:

(1)在同一时刻,部分对象只属于一个整体对象;

(2)整体对象被销毁,部分对象也要销毁;

虽然UML定义了聚合的概念,但实践中要不要使用聚合,经常会引起争论。在聚合关联中,部分对象同一时刻可以被多个整体对象共享,使得“整体-部分”的概念变得模糊,和普通关联难以区分。

James Rumbaugh等人在《UML参考手册(第2版)》中认为聚合是建模的“安慰剂”。

图片

图8-125 摘自Unified Modeling Language Reference Manual, 2nd Edition, James Rumbaugh, Ivar Jacobson, Grady Booch, 2004

Craig Larman认为不需要使用聚合,在合适的情况下使用组合即可。

图片

图8-126 摘自Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development, Third Edition, Craig Larman, 2004

8.3.4.3 关于“整体-部分”结构

之所以在关联关系中进一步划分出一个“整体-部分”关联,是希望把小的对象进一步组装成更大的对象,以获得更大的复用单元。

如果把关联定义为“整体-部分”的关联,意味着部分对象成为整体对象的部件,外部的对象不能发消息给部分对象,只能发给整体对象,再由整体对象分解和分配给组成它的部分对象,如图8-127所示。

图片

图8-127 “整体-部分”关联影响责任分配

类图上有很多类,类之间的密切程度会有所不同。如果根据目前责任分配的情况,判断某些类之间协作的频率远超过它们和外部其他类协作的频率,而且预判将来也可能是这样,那么通过建立组合关联来强制把它们封装成一个整体来分配责任,是合算的。

而“目前责任分配的情况”也不是随意得到的,需要结合类的属性和关联来分配。这个过程会包括多次互相尝试和互相验证,详细内容在行为建模部分再讲述。

和划分部门类比

建立组合关联和公司的部门划分有类似之处。

公司不划分部门,老总一个个员工派任务也能达到目标,只是效率不高,而且不管出现什么变化都要打开老总的“代码”来修改。

划分部门之后,老总就省心多了,只需要给各部门分配大任务,部门把任务分解,再分配给部门内的各小组,各小组再把任务分解,分配给小组内的小小组……这样,各种逻辑就会分散到各个部门、小组、小小组……

当然,这是有代价的。划分部门之后,上级就不要越过下级去找更下级,下级也不能想找谁就找谁,都要讲基本法。

如果部门内各下级之间的协作频率远高于和其他部门协作的频率,说明这样的代价是值得付出的,部门划分以及责任的分解和分配是合理的。反之则说明不合理。

本书建议(1):

在没有足够证据的情况下,一律使用普通关联,不用组合(聚合)关联。

只有经过序列图、状态机图等进一步建模核心域逻辑之后,有足够证据支持定义为组合(聚合)关联更有利,才定义组合(聚合)关联用于指导后续其他用例的责任分配。

经常看见有“架构师”随意使用组合,图8-128是一张学员发给我评点的类图。可以看到,图上到处都是菱形。

图片

图8-128 一张带有大量菱形的类图(类的信息已隐去)

如果公司老总在没有充分调研员工能力以及公司业务的情况下,着急过一把官瘾,胡乱划分部门,提拔干部,会大大损害所有人的利益,很容易激起反抗。

然而,如果“架构师”因为偷懒或炫耀,胡乱定义组合(聚合)关联,并不会激起各个代码片段的反抗。计算机程序目前还没有产生自我意识,没有Neo(电影“The Matrix”,《黑客帝国》),特别乖,爱怎么整都可以。

如图8-129,如果建模为普通关联,还得给关联想个合适的名字。算了,懒得想,貌似说“订单有顾客”也说得通嘛,“有”那不就是组合(聚合)吗?干脆加个菱形吧,这样还省事,而且相对于一根直线,菱形让人有高大上的感觉!

图片

图8-129 为了偷懒滥用组合(聚合)

最近一些年,由于DDD话语对“聚合”过度吹嘘,某些软件开发人员把“划分聚合”看成“有架构师能力”的表现,于是在没有足够证据的情况下,兴奋地把“聚合”到处用——哈哈,我会切割系统了,我架构师了!

这些人的思维经常是颠倒的:先拍脑袋定“聚合”,然后就按DDD话语的建议来使用,包括外部对象的访问、创建、访问数据等,然后再用实现的代码(show me the code嘛)来“证明”之前划分的“聚合”是正确的,形成“完美”闭环。

用公司类比,相当于公司老总拍脑袋把张三、李四、王五等人划分成一个部门,并任命张三为部门领导,然后通过张三发号施令,再用这个“事实”来“证明”张三作为部门领导是正确的。当然,这样类比不完全贴切,后文批评“聚合根”时还会提到。

本书建议(2):

有必要表达“整体-部分”关联时,仅使用组合,不使用聚合。这一点和Larman是一致的。

我用下面的例子来说明本书的两条建议:

如图8-130,把“微信群”和“微信账户”建模为聚合,而且多重性为多对多。理由是“微信群有微信账户”,而且微信群解散,微信账户还在。

图片

图8-130 含糊的聚合

在没有足够证据时,应该建模为普通关联,如图8-131:

图片

图8-131 尽量使用普通关联

如果一定要使用“整体-部分”关联,使用如图8-132的组合。

图片

图8-132 使用组合

图8-132将“微信群员”和“微信账户”分离,“微信群员”仅属于一个“微信群”。如果“微信群”对象消失,“微信群员”对象及相关属性值也就消失了,但“微信账户”还在。

注意,即使是图8-132,也要有足够证据,而不是为了偷懒和炫耀。

如果只是玩文字游戏,图8-132也可以变成图8-133,从另一个角度来“组合”似乎也未尝不可。

图片

图8-133 另一个角度的组合

标签:8.3,聚合,4.3,组合,对象,微信,整体,关联,软件
From: https://blog.csdn.net/rolt/article/details/139211634

相关文章

  • Homebrew Tap:酿造你的个性化 macOS 软件库
    对于macOS用户来说,Homebrew无疑是一个强大的软件包管理工具,它极大简化了软件的安装、更新和卸载。然而,有时候我们仍然会发现一些特定的、小众的或者专业的软件并不在其中。这时,HomebrewTap就成了救星,它允许我们添加和管理第三方仓库,也可以扩展和定制自己的软件库,从而......
  • STM32F1之I2C通信·软件I2C代码编写
    目录1. 软件I2C代码编写 1.1 I2C起始方法一方法二方法三方法四1.2 I2C终止1.3 发送一个字节 1.4 接收一个字节1.5 发送应答1.6 接收应答1. 软件I2C代码编写     由于软件I2C不受引脚限制,随便找两个普通的GPIO口就可以使用,首先我们......
  • STM32F1之SPI通信·软件SPI代码编写
    目录1. 简介2. 硬件电路移位示意图3. SPI时序基本单元3.1  起始条件3.2 终止条件3.3  交换一个字节(模式0)3.4 交换一个字节(模式1)3.5 交换一个字节(模式2)3.6 交换一个字节(模式3)4. 代码编写4.1 引脚初始化4.2 引脚置高低电平封装4.2.1  S......
  • 【csp202403-1】词频统计【第33次CCF计算机软件能力认证】
    问题描述在学习了文本处理后,小P对英语书中的......
  • 关于软件工程这一学科的思考
    问:Softwareenginecring,ofcourse,presentsitselfasanotherworthycause,butthatiseyewash:ifyoucarefullyreaditsliteratureandanalysewhatitsdevoteesactuallydo,youwilldiscoverthatsoftwareengineeringhasacceptedasitscharter‘Howt......
  • idm软件是做什么的 IDM是啥软件 idm软件怎么下载 idm软件怎么下载
    一、IDM是啥软件IDM是由美国Tonec公司开发的Windows 软件,该软件最初于2005年发布。IDM全称InternetDownloadManager,是一款Windows平台老牌而功能强大的下载加速器,专注于互联网数据下载。这款软件是一款不错的轻量级下载工具,安装简单,操作便捷,下载速度快,其中,比较引人注......
  • mac清理软件推荐免费 mac清理系统数据怎么清理 cleanmymac和腾讯柠檬哪个好
    macbook是苹果公司的一款高性能的笔记本电脑,受到了很多用户的喜爱。但是,随着使用时间的增长,macbook的系统也会积累一些垃圾文件,影响其运行速度和空间。那么,macbook系统清理软件推荐有哪些呢?macbook用什么清理系统垃圾呢?本文将为你介绍一款优秀的macbook系统清理软件,以及如何使......
  • Epson 机器人远程以太网控制软件
    Epson机器人远程以太网控制软件Epson控制台是一款功能强大的远程以太网控制软件,专为工业机器人操作而设计。无论是在制造业、物流行业还是科研教育领域,这款软件都能帮助您实现对机器人系统的远程控制和管理。核心功能1.便捷的TCP/IP连接通过设置IP地址和端口号,用户......
  • 软件工程——内聚性和耦合性
    一、耦合性耦合性指软件结构中模块相互紧密连接的紧密程度。耦合性由高到低分别为:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合。1.内容耦合:一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一模块的内部;一个模块有多个......
  • FS7152/FS7022B双节4.2V/4.35V锂电池充电保护芯片
    ​概述FS7022/B 是一款基于 CMOS 的双节可充电锂电池保护电路,它集高精度过电压充电保护、过电压放电保护、过电流充电保护、过电流放电保护、电池短路保护等性能于一身。正常状态下,FS7022/B 的 COUT 端和 DOUT 端都输出高电平,分别使外接充电控制 N-MOSFET 管 Q1 ......