【问题标题】:How to represent shared objects in UML?如何在 UML 中表示共享对象?
【发布时间】:2017-03-18 02:54:08
【问题描述】:

为了设计我的代码,我正在绘制一些 UML 类图。 我有一些共享对象,我想知道应该如何绘制,因为这些对象的所有权是真正共享的。 更具体地说,这里有一个 C++ 示例来说明正在发生的事情:

class A
{
public:
  A(){
    std::shared_ptr<CSharedObj> sharedObj = std::make_shared<CSharedObj>;
    mB = B(sharedObj);
  }
private:
  B mB;
};

class B
{
public:
  B(std::shared_ptr<CSharedObj>);
private:
  std::shared_ptr<CSharedObj> mSharedObj;
};

class CSharedObj
{
public:
  CSharedObj();
};

如何在类图中表示这 3 个类之间的关系?

【问题讨论】:

  • 为什么B 需要CSharedObj 的共享所有权? B 的生命周期与 A 的生命周期相同,因此它可以安全地拥有一个指向 CSharedObj 的非拥有指针,不是吗?
  • 你说的理论上是对的,但是架构比上面的例子复杂一点。这个想法是 A 创建所需的一切并将其分配给每个子组件(假设我们有 B1、B2、B3、...、Bn 共享 A 创建的一些资源)。您不想创建多个资源,因为它们与硬件模块具有一对一的关系,但也不需要将它们存储在 A 中,因为除了初始化和传递给 Bi 之外,它不会对它们做任何事情。
  • 好的,如果有多个B 就更有意义了,而且我没有发现A 不存储共享对象。
  • 你在哪里看到 3 个类?只有两个,即AB
  • 第三类是CSharedObject。我没有写定义,因为它是一个微不足道的定义(类 CSharedObject {};),而且很明显它是一种类型而不是实例,因为它是 shared_ptr 的模板参数。

标签: object uml shared-ptr class-diagram shared-objects


【解决方案1】:

UML 没有准确定义这段 C++ 代码应该如何反映在图表中。有几种选择,这是我的建议:

我对 mB 使用了合成(填充菱形),因为当 A 的封闭实例被破坏时,B 的实例也被破坏。

因为 CSharedObject 的实例可能被多个拥有的对象共享,所以我对 mSharedObj 使用了共享聚合(开放菱形)。在整个项目中,您可以设置约定,shared_ptr 指向的对象使用共享聚合关系在类图中表示。

注意,这个类图没有指定 A 创建的 CSharedObject 实例与 mSharedObj 指向的实例相同。如果需要,您可以添加注释来描述这一事实。

如果您真的想在图表中显示 shared_ptr,您可以这样做:

有关模板化分类器的更多信息,请参阅 UML 2.5 规范第 9.3 节。

【讨论】:

  • 嗯,CSharedObject 就是这个名字所说的:一个对象。不是一堂课。您可以愉快地混合类和对象,就好像它们都是类一样。
  • @ThomasKilian;很久以前我用C++开发过,但我认为它是一个类。请参阅en.cppreference.com/w/cpp/memory/shared_ptr 的示例。用实例化时的类来命名类是一个很好的命名约定。例如,“Person”是一个类的好名字,虽然每个 Person 都是一个对象。
  • class关键字之后定义了一个类。 OP 错误地使用了表示实例的词类。
  • @ThomasKilian,该代码 sn-p 中不存在类 CSharedObject 的声明,但我希望完整的工作应用程序在源代码中的某处具有该声明。
  • 我想我知道你的意思:-/请对你的答案进行虚拟编辑,以便我可以更改投票。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 2010-11-11
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多