デザインパターン 装置制御への応用

とある検査装置を制御するプログラムをてがけました.。開発ツールはBorland C++ です。

この検査装置ではステージや測定器等のデバイスを、パラレルIO、シリアルIOで制御する必要がありました。また、待機中・測定中・復帰中などの状態管理が必要でした。

さまざまなインタフェースの入力を監視してそれに応じた動作を行なわなければいけないので、これをすっきり記述するため、Observerパターンを使用しました。大まかには、別スレッドで定期的にポーリングを行なうクラス→各種入力を監視するクラス(I/O毎にクラス作成)→状態を管理するクラス→画面表示クラスといった具合に連鎖的にイベントを起こすのです。クラス間の誘導可能性(クラス図に記述する矢印)はちょうどこれと反対の向きになります。

具体的な記述方法で工夫した点はObserver役にクラスではなくクロージャを使用したこと、Observer役の管理に標準テンプレートライブラリのvectorを使用したことです。クロージャを使用することで必要なクラスの数が減ります。vectorを使うことでTListを使うよりも型安全になります。VBや.NETではイベントの機構を使用すればObserver役の管理をランタイムルーチンがやってくれるのでもっとすっきりと記述できます(VBに関しては他の面でできないことも多いですが)。

Observerパターンを全面的に使用することで無駄なポーリングを回避でき、クラス間の関係がすっきりと記述でき、インターフェース毎のクラスの独立性が高いため入出力インタフェースの追加・変更も簡単になりました。

状態の管理はStateパターンを使用しないでswitch caseで判別しました。Stateパターンは状態1つにクラス1つ必要でクラス内のメソッド数が2個と少なくデメリットのほうが上回っていたからです。この部分のデバッグは非常に煩雑でわかり難く問題点として残りました。状態の管理はFiber(マイクロスレッド)や排他処理+通常のスレッドを使ったほうがよいかもわかりません。その場合異常状態をどのように表現するかがポイントなるものと考えています。