我应该把删除的成员函数放在 uml 类图中吗?

Should I put deleted member function in uml class diagram?

提问人:Gameriker 提问时间:12/20/2021 最后编辑:ChristopheGameriker 更新时间:12/20/2021 访问量:315

问:

我是否应该将删除的方法或成员函数放在 UML 类图中,例如对于这样的类:

class ProfilometerManager
{
    int a = 6;
public:
    ProfilometerManager(ProfilometerManager& other) = delete; //can not be cloneable
    ProfilometerManager& operator=(const ProfilometerManager&) = delete; // can not be assignable
};
C++ UML 类图 删除函数

评论

1赞 Pepijn Kramer 12/20/2021
它基于意见,我通常做的是定义一个基类 NonCopyable 并在我的图表中使用它。或者我添加一个角色<<NonCopyable>>并把它放进去。基本原理:NonCopyable 是一个可重用的概念(如 <<Singleton>>)。注意:我还会在代码中从 NonCopyable 派生 ProfilemeterManager
0赞 Gameriker 12/20/2021
谢谢 :) 我怎样才能将您的评论标记为答案?
0赞 Christophe 12/20/2021
@PepijnKramer 它根本不基于意见:表示法不符合 UML 语法。但我支持你的想法,即定义一个刻板印象来识别相关概念,无论是在类上还是在功能级别。
0赞 Christophe 12/20/2021
由于问题是关于在 UML 类图中显示已删除的成员,并且由于 UML 2.5.1 规范非常明确地说明了这是否可行并且与 UML 语法兼容,因此我投票重新讨论这个问题。这不是基于意见的,我邀请接近的选民查阅 UML 规范的第 9 章以找出原因。
0赞 Pepijn Kramer 12/20/2021
@Christophe 也许我说错了,我知道它不是标准的UML,所以这就是为什么我认为我的答案会是一个意见。刻板印象是我一直在寻找的词。

答:

1赞 Christophe 12/20/2021 #1

UML 表示法不支持此表示法。UML 规范定义了一种语法,用于属性的默认值,但不用于操作(成员函数)。对于大多数读者来说,类图中操作后面的后缀 = delete 在语法上是不正确的和令人困惑的,即使 C++ 从业者会理解它。因此,您不应该使用这样的表示法(如果将其视为实现细节,则更不应该使用)。=

UML 没有内置的方式来表示没有操作的方式,就像在 C++ 中一样:如果一个操作没有显示在 UML 图上,它可能意味着它不存在,或者它存在,但与图的目的无关。=delete

在这方面,如果删除对您的设计至关重要:

  • 如果这种情况相当罕见,最简单的方法是以纯文本形式向类添加注释。
  • 如果这在您的领域中非常常见且重要,您可以考虑在 UML 配置文件中定义构造型,即 .«Deleted»

如果对您的设计来说重要的不是删除单个成员函数,而是它们对类的影响(例如 正如 Pepijn Kramer 的评论所建议的那样),你可以更好地用临时的阶级刻板印象来表达这一点。这将更具表现力,您可以将设计映射到实现规则,而不会迷失在太多细节中。«not copiable»

评论

1赞 Axel Scheithauer 12/21/2021
完美的答案。我还有一个建议:您可以重新定义操作并将其设为私有。