第 4 章 プロトタイプシステムの設計 30
5.2 基本システムフレームワーク
¯ イベント定義機能
この機能の実現には, Event, CVSCommand, CustomisedEventが関係している.
Adapterは抽象クラスEventを集約しており, Eventを継承することにより,さまざま なイベントをカスタマイズできる. たとえば, checkoutやcommitなどといったCVS のコマンドを単位としたイベントを定義しているCVSCommand, CVSプロトコル の内部コマンドを単位としたCVSProtocolCommand,本フレームワークの拡張者が 独自に定義したCustomisedEventなどとして拡張できる. この拡張性の実現のため の設計には, Strategyパターンと1:N ConnectionメタパターンをAdapterとEventに 適用している. 抽象クラスEventがhook classとなっている.
¯ タスクマネージャ機能
この機能は, ExtendedFunctionManager とCustomisedExtendedFunctionManagerで実 現される.
抽象クラスExtendedFunctionManager は, シンプルな機能をデフォルトで実装して いる. それは, あるイベントが起こった時その通知を受け取って, それに対応する 拡張機能を呼び出すというものである. 拡張機能間の呼びだし順序やそれらの間 の依存関係を考慮しなければならないなどといった, より複雑な制御機能が必要に なる場合には, サブクラスCustomisedExtendedFunctionManager をつくりメソッド invoke event handler をオーバーライドして機能拡張を行う. Adapter と Extended-FunctionManager との関係には, ExtendedFunctionManager が hook classとなる 1:1
Connectionメタパターンを適用している.
¯ イベントハンドラ機能
この機能の実現には, ExtendedFunction, ExtendedFunction1, ExtendedFunction2 が関 係する.
本フレームワークを利用する拡張機能は,必ず抽象クラスExtendedFunctionのサブ クラスでなければならない. ExtendedFunctionは抽象メソッドexecuteを持っており, サブクラスはメソッドexecuteの実装として拡張機能を実装する. ExtendedFunction-Manager は ExtendedFunction をコンポジションしており, この設計には Command パターンとExtendedFunctionがhook classである1:N Connectionメタパターンを適 用している.
特に重要なのは,一つめの“制御の流れを管理する機能”である. 現在ソフトウェアに拡 張性を与えるメカニズムとしてよく使われているものに, Apache [15]などが採用してい るプラグインアーキテクチャ[20]がある. このアーキテクチャには,実行時に動的にソフ トウェアの構成を変更することができ機能拡張が可能であるという利点があるが, 2.1節 で議論したエントリポイントは固定しており,あらかじめ決められたポイントでしか機能 を拡張することができない. しかし,オブジェクト指向フレームワークを利用して実装さ
れている基本システムフレームワークの提供する“制御の流れを管理する機能”により,実 行時に動的に変更することはできないが,エントリポイントの数や場所を自在に拡張でき る. この機能により,さまざまな拡張機能要求に柔軟に対応することができる.
以上のホットスポット部分以外に, CVSプロキシとして動作するために必要なクラスが基 本システムフレームワーク層には組み込まれている. その代表はSocketIO, ClientSkeleton, ServerStubとRCSFileAccessorである. SocketIOは,ネットワークソケットへの入出力を機 能を実装している有用なメソッド群を持っているクラスである. これを継承して,クライア ントとの通信を担当するClientSkeleton, サーバとの通信を担当するServerStubがモデル 化されている. また, RCSFileAccessorは下層のRCSライブラリ層の提供する機能へのイ ンタフェースとなる機能を実装している. ExtendedFunctionManager と ExtendedFunction のサブクラスが必要に応じてRCSFileAccessorを利用してCVSリポジトリ内のRCSファ イルにアクセスを行う.