如何保证 class 专业化是一致的
How to guarantee that class specializations are consistent
我有两个摘要类,代表一个作文:
- 国家(由人组成)
- 人
我对这两个 class 进行了具体化,例如:
- 国家/地区:法国和意大利
- 人物:法国人和意大利人
国家摘要class作为人物列表作为属性:peopleList:People
我如何保证 France class peopleList 属性将仅由 FrenchGuy 填充,以及 Italy 与 ItalianGuy,并使其保持一致 ?
我的设计方式是反模式吗?
提前感谢您的回答
基本上您可以使用 Generalization Sets 来做到这一点。这将确保来自 Italy
和 Italian Guy
的概括(您有一个 male-only 国家?)是相关的,因此您将只有 "right" 人口。
我将用一个不会混淆 "is a kind of" 和 "is an instance of" 的例子来回答这个问题。 (有关更多详细信息,请参阅我对原始问题的评论。)
你确实可以保证特定的专业只与某些其他专业相关联。您可以使用 UML 关联专业化和 属性 重定义来做到这一点。
我将向您介绍此 UML 图告诉我们的内容:
Insurance Policy
和 Insurable Thing
之间有一个未命名的关联,它有两个属性:insures 和 insured by.它告诉我们,一般来说,每个Insurance Policy
保险一个或多个Insurable Things
,每个Insurable Thing
可能保险 任意数量的 Insurance Policies
.¹
- 一个
Insurance Policy
有两个不相交的²特化:Health Insurance Policy
和 Car Insurance Policy
。
Insurable Thing
有两个不相交的特化:Car
和 Person
。
- 顶部的未命名关联有两个具有更具体 属性 约束的专门关联:
Car Insurance Policy
和 Car
之间的关联具有重新定义(即收紧)它们允许的类型的属性。
Health Insurance Policy
和 Person
之间的关联具有 重新定义 (即收紧)它们允许的类型的属性。
专业协会和重新定义正在这里做所有的工作。如果愿意,您可以进一步收紧多重性,甚至更改 属性 名称³。
¹ 请注意,UML 最近采用了 "dot notation",这使得关联末端缺少点变得不明确。前点符号,可导航的 属性 由关联另一端的 class 拥有。 Post 点符号,可导航的 属性 归协会所有——除了很少有工具支持它,而那些支持它的工具,如 MagicDraw,会关闭点 默认在项目选项中!我个人觉得点符号很糟糕,所以这个例子没有使用它,这意味着属性由其关联另一端的 class 所有。
² 不相交意味着没有任何东西可以是两个专业化的实例,许多实现语言不允许,但现实世界和 UML do 允许。不完整是指可能还有其他种类的保单我们没有调出来,可以直接实例化一般的Insurance Policy
.
³ 如果您更改 属性 名称,这意味着在其所有者的上下文中,该名称会掩盖通用所有者中的名称。如果您 "upcast" 专业化,相同的 属性 将具有其原始名称,因为它在广义所有者的上下文中。
我有两个摘要类,代表一个作文:
- 国家(由人组成)
- 人
我对这两个 class 进行了具体化,例如:
- 国家/地区:法国和意大利
- 人物:法国人和意大利人
国家摘要class作为人物列表作为属性:peopleList:People
我如何保证 France class peopleList 属性将仅由 FrenchGuy 填充,以及 Italy 与 ItalianGuy,并使其保持一致 ?
我的设计方式是反模式吗?
提前感谢您的回答
基本上您可以使用 Generalization Sets 来做到这一点。这将确保来自 Italy
和 Italian Guy
的概括(您有一个 male-only 国家?)是相关的,因此您将只有 "right" 人口。
我将用一个不会混淆 "is a kind of" 和 "is an instance of" 的例子来回答这个问题。 (有关更多详细信息,请参阅我对原始问题的评论。)
你确实可以保证特定的专业只与某些其他专业相关联。您可以使用 UML 关联专业化和 属性 重定义来做到这一点。
我将向您介绍此 UML 图告诉我们的内容:
Insurance Policy
和Insurable Thing
之间有一个未命名的关联,它有两个属性:insures 和 insured by.它告诉我们,一般来说,每个Insurance Policy
保险一个或多个Insurable Things
,每个Insurable Thing
可能保险 任意数量的Insurance Policies
.¹- 一个
Insurance Policy
有两个不相交的²特化:Health Insurance Policy
和Car Insurance Policy
。 Insurable Thing
有两个不相交的特化:Car
和Person
。- 顶部的未命名关联有两个具有更具体 属性 约束的专门关联:
Car Insurance Policy
和Car
之间的关联具有重新定义(即收紧)它们允许的类型的属性。Health Insurance Policy
和Person
之间的关联具有 重新定义 (即收紧)它们允许的类型的属性。
专业协会和重新定义正在这里做所有的工作。如果愿意,您可以进一步收紧多重性,甚至更改 属性 名称³。
¹ 请注意,UML 最近采用了 "dot notation",这使得关联末端缺少点变得不明确。前点符号,可导航的 属性 由关联另一端的 class 拥有。 Post 点符号,可导航的 属性 归协会所有——除了很少有工具支持它,而那些支持它的工具,如 MagicDraw,会关闭点 默认在项目选项中!我个人觉得点符号很糟糕,所以这个例子没有使用它,这意味着属性由其关联另一端的 class 所有。
² 不相交意味着没有任何东西可以是两个专业化的实例,许多实现语言不允许,但现实世界和 UML do 允许。不完整是指可能还有其他种类的保单我们没有调出来,可以直接实例化一般的Insurance Policy
.
³ 如果您更改 属性 名称,这意味着在其所有者的上下文中,该名称会掩盖通用所有者中的名称。如果您 "upcast" 专业化,相同的 属性 将具有其原始名称,因为它在广义所有者的上下文中。