UML 与泛型和可为空字段的关系

Posted

技术标签:

【中文标题】UML 与泛型和可为空字段的关系【英文标题】:UML relationships with generics and nullable fields 【发布时间】:2016-08-28 17:03:12 【问题描述】:

(0) 当类Foo 包含Predicate<Bar> 或类似类型的字段时,FooBar 的关系是什么?

class Foo 
    Predicate<Bar> validator;

(1)如果类Foo包含Bar的通用容器(不一定是列表;可能是一个Bar的框),那么FooBar的关系是什么?

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 和无效的Bars 属于亡灵类别(因为......即没有酒吧就活不下去)

【讨论】:

以上是关于UML 与泛型和可为空字段的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何识别泛型类型的可为空引用类型?

无法在泛型方法中将类型更改为可为空

如何使用 Java 互操作处理可为空的泛型

模板与泛型编程

在 useState 中具有泛型类型的 Typescript 函数,允许可为空

模板与泛型编程——定义模板