实际上,制作一些业余的UML问题!在创建UML图表来模拟某些域概念时,您会遇到一个域概念,即#34;持有"关于另一个概念的一些信息,是否更好地持有该实体的印章/引用或将整个实体保留在模型本身中?请记住,这与创建一个简单的高级模型有关 - 我确信在实现阶段,情况会略有不同。
例如,下面两个模型中的哪一个实际上是正确的?第一个有一个组合关系,FlightBooking持有整个Flight。在第二个中,FlightBooking只是对Flight的引用。
其次,在创建高级UML图建模领域概念时,您真正想要了解多少细节?例如,在下图中,航班可以将有关原点/目的地的详细信息保存为字符串,或者我可以为这些概念建模单独的类并创建组合关系。哪两个是可取的?
另外,另一件事是,在对上面的飞行"持有"作为另一个类而不是字符串的orig / destination,这两种方式中的哪一种是正确的建模方式?我很困惑何时展示协同作用以及何时展示作文。
答案 0 :(得分:19)
协会:
这意味着两个班级有某种关系,可能是真的
例如:A使用B,A以给定方式与B相关。
成分:
这也是一种用于建模“所有权”的特殊关联类型。这与聚合非常相似,唯一的区别在于它描绘了整体关系,而“部分”实体没有自己的独立存在
例如:A由B组成; B是A的一部分,因此没有A就不存在。
好的解释:UML Class Diagram: Association, Aggregation and Composition
答案 1 :(得分:1)
对不起,如果这有点长......
如果您正在尝试对域概念进行建模,那么我建议您忘记组合/聚合并坚持使用简单的关联。为什么?因为决定组合/聚合会妨碍重要问题。他们是:
关系命名您可以通过命名rel结束来完成(1)。不使用角色名称(例如第一个示例中的“Flights”),因为它不会告诉您关于为什么存在关系的信息。所以在你的例子1中:这种关系代表什么?它是飞机上的预留座位吗?一个确认的?支付?无法从图中看出它的立场。基于动词的命名有多种方法,参见例如this post。为什么这样?因为它会提示您确保了解域。关系中存在很大比例(可能是大多数,尽管我从未证明过)域规则。因此,理解关系存在的原因是理解领域的基础。
基数可能比命名更明显。你应该在两端确定 - 包括上限和下限。在下端重要的是它是否是可选的(即0或1)。在上端,1或多个。这再次表明了域中的重要规则。回到你的例子:航班预订中有多少航班?一次飞行可以进行多次预订吗? (无论'在'意思是......)。
创建/删除行为谁创建了关系实例?谁删了?如果一端被删除,另一端会发生什么?同样,来自问题域的所有重要规则。
那些希望也回答你的第二个问题。不要吝啬关系。花点时间了解它们。它们是了解域名的秘诀。回答上面提到的所有问题,比在组合/聚合/关联中做出更多决定会给你更多的洞察力。
如果您确实想要显示合成与关联,但如果您回答上述问题则它是机械的:
否则使用简单的关联。至于聚合:忽略它。从词汇表中删除它。造成更多混乱而不是它的价值。通过聚合,您可以说出的所有内容都可以通过正确定义的简单关联更加清晰准确地说出来。
第h
PS:语法点:Composition使用填充的钻石。你所展示的是聚合。
答案 2 :(得分:1)
composition
,shared
甚至none
,所有三个都是聚合。 所以, composition 是聚合的一个子集 和 聚合是<的一个特征kbd> association
答案 3 :(得分:0)
对于您的第一个示例,第一个图表(包含合成)是正确的。你的第二个选项,将flightID称为int,可以工作,但它不完整:int本身并没有为你提供访问Flight对象的方法。 Flight类不会神奇地存储您可以按编号检索的航班对象列表,因此第二个选项需要某个第三个类来存储所有Flight对象。
对于你的第二个问题,在高层次上它实际上取决于个人偏好(或你教授的个人偏好!)。试着用你最好的判断。