例如,下面两个模型中哪一个才是正确的?第一个具有组合关系,FlightBooking持有整个Flight。而第二个,FlightBooking只是持有Flight的引用。
其次,在创建高级UML图模型领域概念时,你真正需要多少细节?例如,在下面的图表中,一个航班可以保存关于起点/终点的字符串,或者我可以为这些概念建立单独的类并创建组合关系。哪种方法更可取?
其次,在创建高级UML图模型领域概念时,你真正需要多少细节?例如,在下面的图表中,一个航班可以保存关于起点/终点的字符串,或者我可以为这些概念建立单独的类并创建组合关系。哪种方法更可取?
关联(Association):
指两个类之间存在某种关系,可以是任何类型的关系。
例如:A使用B,A与B有一定的关系。
组合(Composition):
这也是一种特殊的关联类型,用于模拟“所有权”。它与聚合非常相似,唯一的区别在于它描述了整体-部分的关系,并且“部分”实体没有自己独立的存在。
例如:A由B组成;B是A的一部分,因此不能没有A而存在。
好的解释: UML类图:关联、聚合和组合
如果您正在尝试对领域概念进行建模,那我建议您忘记组合/聚合,而是坚持使用简单的关联。为什么?因为决定组合/聚合会妨碍重要问题的解答。这些问题是:
关系命名 通过为关系端点命名来实现(1)。不使用角色名称(例如您第一个示例中的“航班”),因为这并不能告诉您关系存在的原因。因此,在您的示例1中:该关系代表什么?是航班上的预留座位吗?确认的座位?已付款?从图表中无法确定。有各种基于动词的命名方法,请参见this post。为什么要这样做?因为它促使您确保了解领域。大部分(可能是大多数,尽管我从未证明过)领域规则存在于关系中。因此,了解关系存在的原因对于理解领域至关重要。
基数 比名称更明显。您应该在两端确定 - 上限和下限。在下限方面,重要的是确定是否可选(即0或1)。在上限方面,是1还是多个。同样,这会从领域中浮现出重要的规则。回到您的示例:一个航班预订中有多少个航班?一个航班可以在多个预订中吗?(无论“在”意味着什么...)。
创建/删除行为 谁创建关系的实例?谁删除?如果其中一端被删除,另一端会发生什么?同样,所有来自问题领域的重要规则。
这些答案也希望回答了您的第二个问题。不要省略关系。花时间去理解它们。它们是理解领域的秘密酱汁。回答上述所有问题将为您提供比尝试在组合/聚合/关联之间做出决定更深入的见解。
如果您真的想展示组合与关联,那么只需回答上述问题即可。
如果关系的一端的基数是1:1(即只能有一个),并且该端负责创建和删除另一端的实例,则可以将其表示为组合。否则,请使用简单的关联。至于聚合:请忽略它。从价值上讲,它会引起更多的混乱。您可以通过正确定义的简单关联更清晰、更精确地表达聚合所能表达的所有内容。希望对您有所帮助。PS:语法要点:组合使用填充的菱形。您展示的是聚合。组合
、共享
甚至无
,这三个都是聚合。对于您的第一个例子,使用组合的第一张图是正确的。您的第二个选项,将flightID作为int引用,可能可以工作,但它是不完整的:仅凭该int无法让您访问Flight对象。Flight类并没有神奇地存储可以按编号检索的航班对象列表,因此第二个选项需要在某个地方存储所有Flight对象的第三个类。
对于您的第二个问题,在高层次上,这实际上取决于个人喜好(或您教授的个人喜好!)。只需尽力做出最佳判断即可。