用UML绘制智能指针

Drawing Smart Pointers in UML

本文关键字:指针 智能 绘制 UML      更新时间:2023-10-16

在UML类图中,是否有一种公认的方法来描述共享指针(boost::shared_ptrstd::shared_ptr)所持有的对象?特别是,应该使用空的或全的类金刚石聚集物或成分吗?

我不知道关于如何将智能指针建模为关系的总体共识。

黑钻石意味着控制寿命,白钻石意味着不控制寿命,所以你可以在当地同意使用黑钻石表示unique_ptr,所有黑钻石表示shared_ptr,白钻石表示weak_ptr。

如果你真的想为smart_ptr建模,我建议你在关系中添加一个属性类:

0
|  /----------------
+--+ shared pointer |
|  ----------------/
V

您的UML类模型应该是抽象的,并且没有语言习惯用法。

在实践中,您可以为每种类型的智能点创建一个关系的原型,其中包括OCL约束。我对每个智能指针子类型的具体语义还不够熟悉,无法提供详细信息,但OCL规范应该会有所帮助。

UML不仅仅是用于指定具体实现,而是用于设计解决方案。这就是为什么大多数C++语言/库特性和UML之间没有一一对应的关系。

但是UML在它的使用上和在编程语言上一样是不可知的。这里有一些提示:

  • shared_ptr<T>意味着几个对象可以指向T的同一个实例,如果没有对象再指向该实例,则该实例将被销毁。这在UML中对应于简单关联的情况,只是UML没有说明垃圾收集。

  • 智能指针保证在运行时进行高效访问。因此,您可以使用可导航关联(打开T侧的箭头)。一个更好的选择是使用点符号来显示关联端的所有权(T侧的一个小点,拥有的端总是可导航的,因此打开的箭头将是多余的)。

  • 有些人会声称shared_ptr<T>实现了共享聚合,应该在T的对侧使用空心菱形进行建模我们既不能否认也不能证实这样的声明:UML 2.5.1没有为共享聚合定义任何特殊的语义。因此,使用它并没有错,但它仍然模糊不清:

    Shared:表示属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。

  • 有些人建议用自定义的刻板印象«shared_ptr»来注释关联或聚合。我强烈建议不要使用这种极其模糊的做法:关联有两端,在一端使用shared_ptr并不意味着它也在另一端使用(可能是weak_ptrunique_ptr,甚至什么都没有)

  • 以上所有内容都将无差别地应用于原始指针和共享指针。如Martin所建议的,仅在一个方向上区分链接的唯一剩余方法是对属性或角色(在关联端)使用约束。幸运的是,这些可以用纯文本表达,并且不必是有效的OCL。因此,{shared}{shared_ptr}作为快捷方式意味着属性/关联{ must be implemented with a shared pointer }似乎完全可以接受。但if并不是一种广泛使用的做法。

最后但同样重要的是,即使复合聚合不太可能,也不能完全排除它:您的代码可以使用shared_ptr,但要通过其他方式确保对象实际上在任何给定时间只在一个地方使用。这让我有机会回到我最初的陈述:使用UML来解释你的设计意图,而不是盲目而痛苦地记录一些代码;-)