2013年2月11日月曜日

Policy-based Design


最近、Modern C++ Designという本を読んでます。

この本、C++関連本の中でも上級者向けに位置づけられており買ったはいいものの、なかなか読めずにいました。そこで何となく始めたこのブログに、その内容をまとめていこうかと思います。

この本は、柔軟で再利用性の高いソフトウェアデザインをするためのC++のテクニックを解説したものです。そのために、templateや多重継承といったC++の言語機能を積極活用します。

今の時点で1章までしか読み終わっていませんが、おそらく普通のC++入門本などで学んだだけではこの発想に到達することはまずできなかったと思います。そもそも、templateや多重継承を使っているC++プログラマーがどれだけいるんでしょうか?実際、自分もごく限られた場合にしか使っていなかったし、STLなどのライブラリーも使用したことがありませんでした。

C++の継承メカニズムに今ひとつ柔軟性の無さを感じている方がいたとしたら、この本が提供するテクニックは驚きに値するものとなるかもしれません。著者が提唱するPolicy-based designは、本文中で下記のように紹介されています。

"この技術を簡単に説明すると、特定の動作や構造上の側面を専門に受け持った小さなクラス群(policy)を数多く用意し、そういったポリシーを組み合わせることによって、複雑なクラスの組立を行う設計支援手法ということになる"

ここで、"小さなクラス郡(ポリシー)"を組み合わせて使う複雑なクラスをホストクラスと呼んでいます。ホストクラスは、複数のポリシークラスを多重継承してその機能を実現します。

ホストクラスの例を下記に示します。

ホストクラスManagerはCreationPolicyとCheckingPolicyという2つのポリシークラスを多重継承することで機能を取り入れます。ここで、Creationポリシーはポリシーを導入するホストクラスに何らかのメモリ作成機能を提供するポリシー、CheckingPolicyはポインタに対してのなんらかのチェック機能を提供するポリシーと仮定します。

ここで注目すべきは、2つのポリシークラスはテンプレートクラスであるということです。つまり、ホストクラスは、導入したスーパークラスの詳細な機能が未定のまま、その機能を実現することになります。しかし、スーパースラスはポリシーという"ゆるやかなルール"によって規定されているため、ホストクラスはポリシーのルールに則って実装すればよいのです(ポリシーへの違反は、クラスを実体化した際に言語のセマンティクス・チェックによって検知されます)。

Managerホストクラスを利用するユーザーは、テンプレートパラメータを使って、2つのポリシークラスを下記のように、選択して利用します。

ここで、OpNewCreatorはCreationPolicyのルールに則って作成された何らかのメモリ作成ポリシーの実装、NoCheckはCheckingPolicyに則って作成された何らかのポインタ・チェック用ポリシーの実装です。

このように、複数あるポリシーから必要なポリシーを選択し、利用時に必要な機能をユーザに選択させることで、ソフトウェアの柔軟性と再利用性を高めていくという考え方がPolicy-based designの基本になります。この例では、メモリを作成する方法、ポインタをチェックする方法を、テンプレートパラメータによって指定しています。しかも、選択された機能を持つクラスMyManagerはコンパイル時に静的に生成されています。


0 件のコメント:

コメントを投稿