【发布时间】:2012-12-01 20:31:06
【问题描述】:
什么是 C/C++ 函数指针 (fp) 在 UML 结构图中的最佳表示?
我正在考虑使用界面元素,即使“退化”也可能会受到最多声明一个操作的约束。
我在此文档中找到了一些建议:C and UML Synchronization User Guide, Section 5.7.4。但这听起来很麻烦,在实践中也不是很有用。即使从非常低级别的语义角度来看也是如此。下图简要展示了他们的概念:
恕我直言,C 和 C++ 函数指针被用作接口的狭义视图,它只提供单个函数及其签名。在 C fp 中也可以用于实现更复杂的接口,声明一个包含一组函数指针的结构。
我认为我什至可以设法让我的特定 UML 工具(企业架构师)转发生成正确的代码,并与代码更改同步而不会造成伤害。
我的问题是:
- 将 fp 声明为 UML 中界面元素的一部分是否会提供正确的语义视图?
- 单fp声明应该使用什么样的构造型?至少我需要在代码中提供一个 typedef
所以这将是我的胆量选择。(我发现这个原型是 Enterprise Architect 专有的)并且我需要定义一个合适的原型来适应代码生成.实际上我选择了原型名称“委托”,这是否有任何含义或语义冲突? - 对于 C++,是否在类元素中嵌套“委托”原型接口足以正确表达类成员函数指针?
这是我对 C 语言表示的想法的示例图:
这是应该从上述模型生成的 C 代码:
struct Interface1;
typedef int (*CallbackFunc)(struct Interface1*);
typedef struct Interface1
{
typedef void (*func1Ptr)(struct Interface1*, int, char*);
typedef int (*func2Ptr)(struct Interface1*, char*);
typedef int (*func3Ptr)(struct Interface1*, CallbackFunc);
func1Ptr func1;
func2Ptr func2;
func3Ptr func3;
void* instance;
};
/* The following extern declarations are only dummies to satisfy code
* reverse engineering, and never should be called.
*/
extern void func1(struct Interface1* self, int p1, char* p2) = 0;
extern int func2(struct Interface1* self, char*) = 0;
extern int func3(struct Interface1* self, CallbackFunc p1) = 0;
编辑:
整个问题归结为手头的 UML 工具及其特定代码工程功能的最佳方式。因此我添加了enterprise-architect 标签。
【问题讨论】:
-
@garzanti 如果您的问题很严重,这是一种原始数据类型,我已经提到了这一点(按照链接的文档)。
-
我很认真,但确实是修辞,不是取笑你或其他任何人。我只是相信有时我们必须回归基础。
-
@garzanti 至少我在这里读德语很困惑。但无论如何,我看到使用 uml:DataType 看起来与我的提议相似,不幸的是,我无法使用我的 UML 工具(这可能是正确的)将 DataTypes 嵌套在类中,并且需要额外的 typedef,这使得图表不太清楚这是有意的。
-
@garzanti 我必须纠正自己:函数指针不是 > 而是 >。
-
我认为这种方法一开始就是错误的。为什么需要对函数指针对象建模?
标签: enterprise-architect c++ c uml enterprise-architect