Каким будет лучшее представление указателя функции C/С++ (fp) в структурной диаграмме UML?
Я думаю об использовании элемента интерфейса, может быть даже, если "вырожден" с ограничением наличия не более одной объявленной операции.
Я нашел некоторое предложение в этом документе: Руководство по синхронизации C и UML, раздел 5.7.4. Но это звучит довольно громоздко и не очень полезно на практике. Даже если правильно с очень низкого уровня семантического зрения. Вот схема, кратко иллюстрирующая их концепцию:
IMHO в указателях функций C и С++ используется как суженный вид интерфейса, который предоставляет только одну функцию и ее подпись. В C fp будет использоваться также для реализации более сложных интерфейсов, объявляющих структуру, содержащую набор указателей функций.
Я думаю, что мне даже удастся заставить мой конкретный инструмент UML (Enterprise Architect) переслать код сгенерированного кода и синхронизацию с изменениями кода без вреда.
Мои вопросы:
- Будет ли объявление fp как части элементов интерфейса в UML proivde правильным семантическим представлением?
- Какой стереотип следует использовать для объявления одного fp? По крайней мере, мне нужно предоставить typedef в коде
, поэтому это будет мой выбор кистей.(я нашел этот стереотип запатентован для Enterprise Architect), и мне нужно определить подходящий стереотип, чтобы получить адаптацию кода, На самом деле я выбрал имя "идентификатор" стереотипа, имеет ли это какие-либо последствия или семантические столкновения? - Что касается С++, было бы вложение в стерилизованный интерфейс делегата с элементом класса достаточно, чтобы правильно выразить указатель на функцию члена класса?
Вот примерная диаграмма моих мыслей для представления языка 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;
EDIT:
Вся проблема сводится к тому, что было бы наилучшим образом с помощью инструмента UML и его специфических возможностей разработки кода. Таким образом, я добавил enterprise-architect.