UMLモデルをどうやってC言語に落とし込むか:ETロボコン2006へと続く道(3)(2/3 ページ)
UMLでモデルを設計しても、実機で性能を追求するならC言語だ。モデルを極力崩さずにC言語に落とし込む実践テクニックを紹介しよう
UMLのモデルから実装コード(C言語)への落とし込み
基礎教育ではC++言語での実装についてのみ紹介しました。本記事ではC言語で実装コードへ落とし込むポイントについて紹介します。
C言語は手続き指向のプログラミング言語であり、オブジェクト指向プログラミング言語ではありません。機能分割によりシステムを整理する構造化手法で考えたものをプログラミングするのに適した言語です。基本的にはデータと処理は分けて整理します。
このためC言語では、クラス、継承、ポリモルフィズムといったオブジェクト指向の概念がプログラミング言語レベルでサポートされていません。従って、UMLモデルをC言語で実装する場合には、(C++言語ではサポートされている)これらの概念を実現する仕組みを明示的に実装する必要があります。
クラスの実装(構造体を用いた実装)
C言語ではクラスを構造体として定義します。属性を構造体のメンバーとし、操作についてはクラス名を関数として実装します。クラスの操作として識別するために、以下のことを行います。
- 関数名はクラス名をプレフィックスとして識別する
- 第1引数にクラスの構造体のポインタ(C++言語のthisポインタに相当)を割り当てる
C言語の制約から、属性と操作の可視性についてはともにpublic(外部からアクセス可能)になってしまいます。
コンストラクタとデストラクタ
コンストラクタとデストラクタを記述し、それぞれ属性の初期化、後始末を行います。
インスタンスを生成する場合には必ずコンストラクタを呼び出し、消去する際には必ずデストラクタを呼び出します。関数内の内部変数としてインスタンスを値で定義する際にも、コンストラクタ、デストラクタを明示的に呼び出さなければなりません。
関連の実装
1対1の関連
関連はC++と同様です。多重度が「1」の場合は、ポインタあるいは値で保持します。多重度が「0..1」の場合はポインタで保持し、多重度「0」をNULLで表現するようにします。
1対多の関連(固定のケース)
多重度が「多」で固定の場合は、配列で保持します。
1対多の関連(可変のケース)
多重度が「多」で可変長の場合は、自作コンテナなどで保持する形になります。
継承メカニズムの実装
C言語での継承については、以下のようにしてスーパークラスの属性、操作をサブクラス側で引き継ぐようにします。
Copyright © ITmedia, Inc. All Rights Reserved.