UML 与泛型和可为空字段的关系
Posted
技术标签:
【中文标题】UML 与泛型和可为空字段的关系【英文标题】:UML relationships with generics and nullable fields 【发布时间】:2016-08-28 17:03:12 【问题描述】:(0) 当类Foo
包含Predicate<Bar>
或类似类型的字段时,Foo
与Bar
的关系是什么?
class Foo
Predicate<Bar> validator;
(1)如果类Foo
包含Bar
的通用容器(不一定是列表;可能是一个Bar
的框),那么Foo
与Bar
的关系是什么?
class Foo
SomethingThatHasA<Bar> barContainer;
(2) 如果一个类Foo
有一个Bar
类型的可空成员,那么Foo
是否只是对Bar
有依赖、有关联或者是Bar
的组合?
class Foo
Bar bar; // may be null
(3) (这在 C++ 中可能比在其他地方更有意义)如果一个类 Foo
通常由 Bar
对象组成(即不能没有 Bar
),但允许有一个默认值将其所有字段清零/无效的构造函数作为一种空白状态,直到稍后填充才使用,Foo
是否仍然与Bar
具有组合关系?
class Foo
private:
Bar* bar; // or possibly just a non-pointer Bar
public:
Foo() : bar(nullptr)
Foo(/* whatever */) : bar(/* something */)
;
【问题讨论】:
在class Foo Bar bar;
bar
中不能是null
。你的意思是class Foo Bar* bar;
还是我错过了什么?
@tobi303 罪魁祸首是语言标签垃圾邮件。在 Java 和 C# 中,Bar
可以是 null
。
抱歉,只有(3)中的场景是C++
啊,好的。实际上评论(“可能为空”)很清楚
这似乎与我的问题不一样,因为我也在询问可空值。
【参考方案1】:
(0) 和 (1) :此处适合使用 UML 依赖项:从 Foo 指向 Bar 的虚线箭头。
(2) 至少是一个关联。如果 Foo 和 Bar 的含义是这样的,那么 Bar 可以被认为是 Foo 的一部分,那么您可以使用聚合(开放菱形),例如在 Car 和 Engine 的情况下。此外,如果 Foos 引用的 Bars 实例的寿命不超过它们的 Foos,那么您可以使用组合(填充菱形),即使不是每个 Foo 都有一个 Bar 并且即使不是每个 Bar 都包含在一个 Foo 中.
(3) 是的
【讨论】:
【参考方案2】:(0) none - Foo
只知道通过验证器验证 Bar 的实例。
(3) 是的。 Foo
-s 和无效的Bar
s 属于亡灵类别(因为......即没有酒吧就活不下去)
【讨论】:
以上是关于UML 与泛型和可为空字段的关系的主要内容,如果未能解决你的问题,请参考以下文章