UML的泛化和实现

Umb*_* D. 5 uml code-generation class visual-paradigm generalization

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

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

这是我的问题(我使用Visual Paradigm作为建模工具).我们假设我们有一个微控制器的模块,即Timer.我们有一组我们可以执行,说的操作initTimer(),startTimer(),stopTimer()等等.实际上这些函数定义了一种API.我们可能有不同类别的Timer,比方说TimerA,TimerB,TimerC继承(或实施?)所有的引用操作.这张照片可能会使情景更加清晰.[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]     |
                       +----------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

1)泛化:Timer具有一组操作的类.每个操作都有其代码实现.两个派生类TimerATimerB泛化链接继承类的操作Timer.

2)实现:Timer是一个接口(不是所示的类)和两个实现类TimerATimerB.关键点如下.虽然Timer是一个接口,其操作不应包含实现细节,但VP允许为这三个操作编写实现代码.在代码生成期间,接口C++类Timer被创建:initTimer(),startTimer()stopTimer()虚拟会员Timer没有代码(因为它应该是).TimerA生成一个C++类,它继承了类Timer成员; 另外,这三个操作Timer是在TimerA我为接口类的操作编写的代码实现中被复制的.这也发生了TimerB.

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

xmo*_*jmr 5

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

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

在此输入图像描述

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

我不知道如何正确配置 Visual Paradigm 的代码生成器来生成您想要的内容,但是尽管C++接口只是一个像其他类一样的类keyword,并且这个概念没有什么特殊之处,但UML 接口只是对contract没有耦合的描述。执行。某些语言(例如C#Java)专门interface keyword用于此目的,在编译器中硬编码了无代码规则。

因此,虽然Visual Paradigm最终也许可以生成你想要的代码,但从UML角度来看,用代码建模interface是错误的


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

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

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