連載
» 2006年06月30日 00時00分 公開

ETロボコン2006へと続く道(3):UMLモデルをどうやってC言語に落とし込むか (2/3)

[赤坂 英彦 オージス総研,@IT MONOist]

UMLのモデルから実装コード(C言語)への落とし込み

 基礎教育ではC++言語での実装についてのみ紹介しました。本記事ではC言語で実装コードへ落とし込むポイントについて紹介します。

 C言語は手続き指向のプログラミング言語であり、オブジェクト指向プログラミング言語ではありません。機能分割によりシステムを整理する構造化手法で考えたものをプログラミングするのに適した言語です。基本的にはデータと処理は分けて整理します。

 このためC言語では、クラス、継承、ポリモルフィズムといったオブジェクト指向の概念がプログラミング言語レベルでサポートされていません。従って、UMLモデルをC言語で実装する場合には、(C++言語ではサポートされている)これらの概念を実現する仕組みを明示的に実装する必要があります。

クラスの実装(構造体を用いた実装)

 C言語ではクラスを構造体として定義します。属性を構造体のメンバーとし、操作についてはクラス名を関数として実装します。クラスの操作として識別するために、以下のことを行います。

  • 関数名はクラス名をプレフィックスとして識別する
  • 第1引数にクラスの構造体のポインタ(C++言語のthisポインタに相当)を割り当てる

 C言語の制約から、属性と操作の可視性についてはともにpublic(外部からアクセス可能)になってしまいます。

クラスの実装 図1 クラスの実装

コンストラクタとデストラクタ

 コンストラクタとデストラクタを記述し、それぞれ属性の初期化、後始末を行います。

コンストラクタとデストラクタの実装 図2 コンストラクタとデストラクタの実装

 インスタンスを生成する場合には必ずコンストラクタを呼び出し、消去する際には必ずデストラクタを呼び出します。関数内の内部変数としてインスタンスを値で定義する際にも、コンストラクタ、デストラクタを明示的に呼び出さなければなりません。

インスタンスの生成と消去 図3 インスタンスの生成と消去

関連の実装

1対1の関連

 関連はC++と同様です。多重度が「1」の場合は、ポインタあるいは値で保持します。多重度が「0..1」の場合はポインタで保持し、多重度「0」をNULLで表現するようにします。

関連の実装(多重度1) 図4 関連の実装(多重度1)

1対多の関連(固定のケース)

 多重度が「多」で固定の場合は、配列で保持します。

関連の実装(多重度多で固定) 図5 関連の実装(多重度多で固定)

1対多の関連(可変のケース)

 多重度が「多」で可変長の場合は、自作コンテナなどで保持する形になります。

関連の実装(多重度多で可変) 図6 関連の実装(多重度多で可変)

継承メカニズムの実装

 C言語での継承については、以下のようにしてスーパークラスの属性、操作をサブクラス側で引き継ぐようにします。

継承の実装 図7 継承の実装
継承するスーパークラスの属性
スーパークラスの構造体をサブクラスで丸ごと保持する

継承する操作
サブクラスで新たに継承する操作を定義し、スーパークラスの該当する操作を呼び出す(委譲)

新規に追加する操作
サブクラスの操作として定義する

Copyright © ITmedia, Inc. All Rights Reserved.