UMLモデルをどうやってC言語に落とし込むか:ETロボコン2006へと続く道(3)(3/3 ページ)
UMLでモデルを設計しても、実機で性能を追求するならC言語だ。モデルを極力崩さずにC言語に落とし込む実践テクニックを紹介しよう
ポリモルフィズムの実現
ポリモルフィズムは同じ操作の呼び出しで異なる処理を実現するものです。これは、抽象クラスで定義された操作の呼び出しで、サブクラスのインスタンスの違いによって異なる処理を実現します。
C++言語では、コンパイラが内部的に仮想関数テーブルを持つことでポリモルフィズムを実現していますが、C言語で実装する場合は、関数を仮想化する仕組みを実装する必要があります。ここでは仮想関数テーブルではなく、簡略化して、関数ポインタを構造体のメンバーとして保持する方法を紹介します。
まず、抽象クラス側で関数ポインタを属性(構造体のメンバー)として保持します。仮想関数の実装に関しては、関数ポインタから呼び出す関数(仕様)と実際の処理(実体)の関数の2つを実装し、コンストラクタで関数ポインタに実体の関数のアドレスを設定します。
クラスの実装(抽象データ型として実装)
ここでは、先述の例とは異なるC言語でのクラスの実装方法について紹介します。
先述の例は、基本的に1クラスから複数インスタンスを生成するケースを想定しています。1つのクラスからインスタンスを1つしか生成しないようなケースでは、すべての属性をクラス属性とすることで、もっと簡単にクラスを実装することも可能です。ただし、継承やポリモルフィズムといったオブジェクト指向の概念の実現についてもあきらめなければなりません。「組み込みソフトウェアをオブジェクトに分割して整理する」というレベルでの実現になります。
この方法では、クラスを定義する際に構造体を用いません。
属性はヘッダファイルでは宣言せずに、実装ファイル中にstaticなデータとして定義します。これにより、属性はファイルスコープに限定されますので、自動的にprivateな属性になります(先述の例では属性はすべてpublicになっていました)。
操作はヘッダファイル中に関数のプロトタイプを宣言し、実装ファイル中に関数を定義します。ここで、関数名にクラス名のプレフィックスを付与するのは先の例と同じです。違いは、この関数の第1引数にthisポインタを渡す必要がなくなることです。
複数インスタンスの生成、継承やポリモルフィズムが扱えないことが問題でないクラスについては、この方法は最も簡単に実現可能だといえます。インスタンスを指定する必要がありませんから、このクラスを利用するクラスでは、関連を値やポインタとして保持する必要もありません。
この方法は、実際にオブジェクト指向以前の抽象データ型として実現していたものです。一部に制約はあるものの、きちんとカプセル化できるメリットがあります。作成するコードの可読性も高く、本来行いたい処理以外のコードを記述する必要もありませんので、可能であればこの方法で実現するとよいと思います。
もちろん、この実装方法を選択するには、設計段階で理想的なモデルから構造を崩す必要が出てくるかもしれません。
基本動作を行うパスファインダーのモデル
実際にパスファインダーのモデルを見ても、1クラスから1インスタンスしか生成しないクラスは多い(唯一「モーター」クラスについては、駆動用モーターとステアリングモーターの2つインスタンス)ので、この方法で実装するメリットはあります。
最後に
2006年5月に実施した基礎教育では、昨年に改編したパスファインダーを題材にした教材を用いて、ETロボコンに直結する、実践的な解説と演習を行いました。しかしながら、2日間の研修だけですので、基礎教育では必要な技術の中のほんの触りの部分についてしか触れることができません。
ETロボコン参加を通じて、モノづくりの楽しさに触れながら、組み込みソフトウェア開発の技術に興味を持っていただき、コンテスト終了後も技術習得に積極的に取り組んでいただけたらよいと思います。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.