9

我对 UML 很陌生,所以我对泛化和实现有一些疑问。我正在对电子微控制器的行为进行建模,我需要从 UML 描述中生成 C++ 代码。

据我所知,一个 实现了一个接口,这意味着它可以提供一个接口的实现。两个类之间可能存在泛化关系。在这种情况下,派生类继承基类的所有成员并获得对公共和受保护成员的访问权。

这是我的问题(我使用 Visual Paradigm 作为建模工具)。假设我们有一个微控制器模块,即Timer. 我们有一组可以执行的操作,比如initTimer(),startTimer()等等stopTimer()。实际上这些函数定义了一种API。我们可能有不同的类,Timer比如TimerA,继承(或实现?)所有引用的操作。图片可能会使场景更清晰。[C] 表示分类器。TimerBTimerC

                        +----------------------------------+   
                        |              <<SW>>              |
                        |           <<Singleton>>          |
         +--------------|              TimerA              |
         |              +----------------------------------+
         |              | -instance : TimerA* = null [C]   |
         |              | -instanceFlag : bool = false [C] |
         |              | -moduleAddress const = 0x0010    |
         |              +----------------------------------+
         |              | -TimerA()                        |
         V              | +getInstance() : TimerA* [C]     |
+---------------+       +----------------------------------+
|    <<SW>>     |       
|     Timer     |
+---------------+
| +initTimer()  |     
| +startTimer() |<-----------------------+
| +stopTimer()  |                        |
+---------------+      +----------------------------------+ 
                       |              <<SW>>              |
                       |           <<Singleton>>          |
                       |              TimerB              |
                       +----------------------------------+
                       | -instance : TimerB* = null [C]   |
                       | -instanceFlag : bool = false [C] |
                       | -moduleAddress const = 0x0020    |
                       +----------------------------------+
                       | -TimerB()                        |
                       | +getInstance() : TimerB* [C]     |
                       +----------------------------------+

Visual Paradigm 允许用户将代码放入每个函数中。我问你箭头应该是哪种关系。

1)泛化Timer具有一组操作的类。每个操作都有其代码实现。两个派生类TimerA,并TimerB具有继承类操作的泛化链接Timer

2)实现Timer是一个接口(不是如图所示的一个类)和两个实现类TimerATimerB。关键点如下。虽然 Timer 是一个接口,其操作不应包含实现细节,但 VP 允许为这三个操作编写实现代码。在代码生成期间,创建了一个接口 C++ 类TimerinitTimer()startTimer()并且stopTimer()没有代码虚拟成员Timer(应该是这样)。生成了一个 C++ 类,它继承了类成员;此外,三个操作在成员之间复制TimerATimerTimerTimerA使用我为接口类的操作编写的代码实现。这也发生了TimerB

您认为这两种描述哪个更好?即使我知道在代码生成后将转移到实现类中,为接口的操作编写代码实现是否正确?

4

2 回答 2

3

您认为这两种描述哪个更好?

在我看来,下图中勾画的选项 3 更好。Timer将是可重用(概念上final)的通用类,它的实例仅由单例包装器配置并通过使用依赖关系链接

在此处输入图像描述

VP 允许为这三个操作编写实现代码。在代码生成期间......为接口的操作编写代码实现是否正确......?

我不知道如何正确配置 Visual Paradigm 的代码生成器来生成你想要的东西,但是虽然C++interface只是一个和其他任何类一样的类keyword,并且这个概念没有什么特别之处,但UML interface只是对 a 的描述,contract没有耦合执行。某些语言(如C#Java )对此有特殊interface keyword用途,在编译器中硬编码了无代码规则。

因此,尽管 Visual Paradigm 最终可能会生成您想要的代码,但从UML角度来看,用代码建模interface是错误的


做出你的选择。如果你只想要做某事代码,那么无论如何都要去破解它(正如@gilead-silvanas 所建议的那样)。如果你想练习UML使用不同的语言在你未来的项目中使用,那就不要。

此外,有时初始生成的代码会偏离初始设计图纸和代码生成器,您将手动对其进行编辑,即使您使用Quantum Leaps Modeler 之类的工具用于嵌入式系统也是如此。

我会(定期)重新考虑与设计工具的斗争是否超过了代码生成的好处

于 2015-04-02T14:34:20.897 回答
2

可能这只是 VP 使事情变得更快的简写。正如您所说,在代码生成时,它无论如何都会从接口中清除这些代码并将其放入实现类中。我认为这没有任何问题,因为重要的是生成的代码,在您的情况下是正确的。

于 2015-04-02T13:49:09.200 回答