C/C++コードにおけるSPL(プロダクトライン開発)可変点の設計・実装テクニック

可変性の実現(可変点の設計・実装)
コア資産は、スコープに含まれる複数の製品での利用を想定して開発されるため、その内部に可変点を含むことがあります。この可変点の設計が適切かどうかで、将来にわたるコア資産の維持管理性や再利用効率が変わってきます。ここでは、モデルやコードに対して、組込みソフトウェア開発で使用される代表的な可変点の設計・実装テクニックを紹介します。
これらのテクニックを用いて開発したコア資産を、開発する製品に合わせて自動的にコンフィグレーションして利用する、すなわち導出する方法については、「可変性の決定に基づく製品の導出」のページを参照して下さい。
※ここで取り上げるのは一例であり、他にも様々な実現方法があります。
C/C++コードにおけるSPL可変点の実装
C言語には、可変性を実装するための基本的な仕組みが多数用意されています。また、C++言語によるオブジェクト指向のサポートやアスペクト指向技術の登場で、より柔軟性の高い実装が可能になっています。C/C++での可変性の実現(インタフェースと実装の分離)
この方式では、「インタフェースと実装の分離」の原則に基づいてソフトウェアを設計します。すなわち、共通なインタフェースと、中身(実現)の異なる実装を、それぞれ別ファイルで実装します。その手順は以下のとおりです。
1.共通となるインタフェースの実装
対象としているコンポーネントを利用する全ての製品をカバーするように、インタフェースを実装します。このインタフェースは共通部となります。
2.可変部の実装
先に作成したインタフェースに対して、その実現をそれぞれ別のファイルとして実装します。
このように実装すれば、開発する製品に合わせて可変部のファイルを選択することで、製品用のコードを構成することができます。また、可変部の内容が製品毎に異なる場合は、インタフェースを実装したファイルを製品開発時に作成します。
C++言語を用いてオブジェクト指向実装を行っている場合は、こちらも参考にして下さい。
C/C++での可変性の実現(継承と多態性の利用)
この方式では、オブジェクト指向の特徴である継承および多態性(ポリモーフィズム)を利用してソフトウェアを実装します。その手順は以下のとおりです。
1.共通となる部分のフレームワーク化
対象としているコンポーネントを利用する全ての製品をカバーするように、抽象実装を行います。ここで定義されるクラス群の内、可変点を持つクラスをスーパークラスとして実装します。これには以下の種類があります。
A) インタフェース
属性や共通メソッドを持たない、単なるインタフェースクラスです。この場合は、「インタフェースと実装の分離」と同一になります。
B) 抽象インタフェースと具象実装を有するクラス
属性や共通メソッドが定義されたスーパークラスで、かつ抽象インタフェースも保有しています。このため、サブクラスにて抽象インタフェースを実装しないと、インスタンス化できません。
C) 具象実装のみを有するクラス
抽象インタフェースを持たないクラスです。よって、これ単体でインスタンス化が可能です。
通常はA, またはBを使いますが、スコープ内の大多数の製品の実装は共通で、ごく少数の製品だけが異なる実装を必要とする場合には、Cの方式を使ってスーパークラスでデフォルト実装を行うと効果的です。
2.可変部の実装
可変点を持つスーパークラスに対して、その差分をサブクラスとして実装します。
このように実装すれば、開発する製品に合わせてサブクラスのコードを選択することで、製品用のコードを構成することができます。また、可変部の内容が製品毎に異なる場合は、サブクラスを製品開発時に作成します。
C/C++での可変性の実現(条件コンパイルの利用)
この方式では、プリプロセッサ命令の1つである条件コンパイル(#ifdef)を利用して、想定される全ての可変要素を含んだコア資産を作成し、製品開発時にシンボルを定義することで使用する可変要素を決定します。その手順は以下のとおりです。
1.想定される全ての可変要素の特定
対象としているコンポーネントを利用する全ての製品をカバーするように、想定される全ての可変要素を特定します。
2.各可変要素の実装
特定された各可変要素が、条件コンパイルによって選択されるように実装します。
このように実装すれば、開発する製品に合わせてコンパイル時にシンボルを定義することで、製品用のロードモジュールを作成することができます。
C/C++での可変性の実現(マクロの利用)
この方式では、製品毎に異なるパラメタをマクロとして定義し、製品開発時に具体的な定数値を与えます。制御ロジックが共通で、パラメタ値のみが異なる場合に利用されます。その手順は以下のとおりです。
1.共通となるコードの実装
対象としているコンポーネントを利用する全ての製品をカバーするように、コードを実装します。この時、製品間の差異をパラメタ値の違いで表わせるようにします。そして、パラメタを定義するマクロを含むファイルをインクルードするようにします。
2.マクロに設定する値の定義
対象とする製品の仕様に合わせて、マクロに設定する値を記述したファイル(マクロファイル)を作成します。
このように実装すれば、開発する製品に合わせてマクロの値を定義することで、製品用のコードを構成することができます。取り得る値が数パターンに限定されるなら、パターン数分のマクロファイルをコア資産として用意しておき、製品に合わせてファイルを選択することもできます。
また、制御ロジックの切り替えにマクロを応用することもできます。この場合、条件分岐の判定に使用する変数をマクロで定義します。

C/C++での可変性の実現(アスペクト指向技術の利用)
この方式では、システム横断的な関心事(crosscutting concerns)の実装に適したアスペクト指向技術を利用します。製品群で共通となるコア資産に対して、可変部をアスペクトとして実装します。その手順は以下のとおりです。
1.共通となるコア資産の実装
スコープ内の製品で共通に利用されるコア資産を実装します。
2.コア資産を拡張/変更するアスペクトコードの実装
横断的な関心事に相当する製品固有のコードを、アスペクトコードとして実装します。
このように実装すれば、開発する製品に合わせてアスペクトコードを実装してウィービングすることで、製品用のコードを構成することができます。アスペクトの実装パターンが限定されるなら、パターン数分のアスペクトコードをコア資産として用意しておき、製品に合わせて選択することもできます。
C/C++での可変性の実現(ライブラリの差し替え)
この方式は、「インタフェースと実装の分離」と基本的に同じです。両者の違いは、選択可能な可変要素がソースコードで提供されるか、バイナリで提供されるかです。
言うまでもなく、製品開発時には利用するライブラリをリンクすることで、製品用のロードモジュールを作成することができます。
SPL専門コンサルタント
サービスに関するご相談は
こちらからお願いします
こちらからお願いします