UML構造図でのC/C ++関数ポインター(fp)の最良の表現は何でしょうか?
私はインターフェース要素を使用することを考えています。たとえ「縮退」したとしても、多くても1つの操作を宣言するという制約があります。
このドキュメントでいくつかの提案を見つけました:CおよびUML同期ユーザーガイド、セクション5.7.4。しかし、これは非常に面倒で、実際にはあまり役に立ちません。たとえ非常に低いレベルのセマンティックビューからでも。これが彼らの概念を簡単に示す図です:
CおよびC++関数ポインターのIMHOは、単一の関数とその署名のみを提供するインターフェースのそのような狭められたビューとして使用されます。Cでは、fpは、関数ポインタのセットを含む構造体を宣言するより複雑なインターフェイスを実装するためにも使用されます。
特定のUMLツール(Enterprise Architect)で正しいコードを転送生成し、コードの変更と同期することで、害を及ぼすことなく管理できると思います。
私の質問は次のとおりです。
- UMLのインターフェース要素の一部としてのfpの宣言は、正しいセマンティックビューを提供しますか?
- シングル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タグを追加しました。