UML的泛化和实现

时间:2015-04-02 13:00:46

标签: class uml code-generation visual-paradigm generalization

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

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

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

                        +----------------------------------+   
                        |              <<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类,包含一组操作。每个操作都有其代码实现。两个派生类TimerATimerB,其泛化链接继承了类Timer的操作。

2)实现Timer接口(不是显示的类)和两个实现类TimerA和{{1} }。关键点如下。虽然Timer是一个接口,其操作不应包含实现细节,但VP允许为这三个操作编写实现代码。在代码生成期间,创建了一个接口C ++类TimerBTimerinitTimer()startTimer()stopTimer()虚拟成员 无代码(应该如此)。生成C ++类Timer,这将继承类TimerA成员;此外,Timer的三个操作被复制到Timer的成员之间,其中包含我为接口类的操作编写的代码实现。这也适用于TimerA

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

2 个答案:

答案 0 :(得分:3)

  

您认为两种描述中的哪一种更好?

在我看来,下图中勾选的选项3更好。 Timer可以重复使用(概念上为final)通用类,它的实例仅由单例包装器配置并由usage dependency relationship链接

enter image description here

  

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

我不知道如何正确配置Visual Paradigm的代码生成器以生成您想要的内容,但虽然C++接口为just a class like any other且此概念没有特殊keyword,{ {3}}仅用于描述没有耦合实现的contract。为此,UML interfaceC#等某些语言具有特殊的interface keyword,编译器中的无代码规则是硬编码的。

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


做出选择。如果您只想要代码执行 某些内容,那么无论如何都要去破解它(正如@ gilead-silvanas建议的那样)。如果您想练习UML以便在将来使用不同语言的项目中使用,那么请不要这样做。

此外,有时候初始生成的代码将偏离初始设计图纸和代码生成器,即使您使用Java之类的工具,也可以手动编辑它。

如果与设计工具交战超重代码生成优势,我会(经常)重新考虑

答案 1 :(得分:2)

这可能只是VP让速度更快的简写。正如你所说,在代码生成时,它会从接口中清除这些代码并将其放入实现类中。我没有看到任何错误,因为重要的是生成的代码,在您的情况下是正确的。