SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Visual WebGUIによるAJAX対応CMS(コンテンツ管理システム)の構築
フレームワークの作成

柔軟なソフトウェアシステムの開発には、強固なフレームワークが不可欠

  • このエントリーをはてなブックマークに追加

 柔軟なソフトウェアシステムを開発するためには、基本的なシステムサービスを実装した基盤が不可欠です。その基盤に求められるのは、開発者にとっての使いやすさと、複雑なシステムにも対応できるパワーを兼ね備えていることです。本記事では、ソフトウェア開発に不可欠な、強固なフレームワークの作成方法について説明します。

  • このエントリーをはてなブックマークに追加

はじめに

 本稿では、前回の記事に続き、Mini CMSシステムの構築を進めていきます。このシステムには、ワークプレースの実体を表すベースコンポーネントが必要です。これらのコンポーネントは、ワークプレース内へモジュールをロードして表示したり、モジュール間で制御を受け渡したり、処理終了時にモジュールをアンロードしたりといった処理を担います。モジュールからは、他のモジュールを呼び出したり、パラメータを渡したりできることが必要です。呼び出された側のモジュールは、呼び出し元のモジュールに制御を戻したり、終了ステータス(ユーザーが変更を保存したかキャンセルしたか)を併せて返したりします。呼び出し元のモジュールは、その内容に応じて、自らを更新します。

 こうしたフレームワークの柔軟性を高めるためには、インターフェースを使用してコンポーネントを定義するのが1番です。実装の中身が既存の特定のコントロールと密接に結び付くのを避けることができ、将来の拡張や実装方法の変更にも対応しやすくなるからです。

WorkplaceコンポーネントとModuleコンポーネント

 アプリケーションの屋台骨となるのが、WorkplaceコンポーネントとModuleコンポーネントです。Workplaceは実際にはコンテナで、各種機能を持つモジュールをこの中にロードできます。ここにロードしたモジュールが、アプリケーションの実際の処理を担うことになります。

 WorkplaceとModuleが実装するインターフェースは次のとおりです。

  • IWTWorkplace:図1に示すWorkplaceコンポーネントのインターフェースを定義したものです。このインターフェースを実装したコンポーネントを使って、実際のワークプレースを実現します。モジュールのロードと表示、既存のモジュールがロード済みかどうかのチェック、全モジュールの非表示化、モジュールの削除が可能です。このインターフェースのプロパティとメソッドは表1のとおりです。
  • IWTModule:Moduleコンポーネントのインターフェースを定義したものです(図1を参照)。すべてのモジュールがこのインターフェースを実装する必要があります。プロパティとメソッドは表2のとおりです。
図1 IWTWorkplaceインターフェースとIWTModuleインターフェース:フレームワークの核となる2つのインターフェース。モジュールのロード、アンロード、表示を担う
図1 IWTWorkplaceインターフェースとIWTModuleインターフェース:フレームワークの核となる2つのインターフェース。モジュールのロード、アンロード、表示を担う
表1 WTWorkplaceインターフェースが定めるプロパティとメソッド
プロパティ 説明
Control BodyPanel{ get; } ワークプレースのコンテナの役割を果たすコントロールへの参照を返します。Visual WebGUIでは、Controlから派生したすべてのコンポーネントがControlsプロパティ(ControlsCollection型)を公開する必要があります。このプロパティは、中に含むすべてのコントロールを保持するものです
string Caption
  { get; set;}
コンテナのキャプション値を設定または取得します。IWTWorkplaceをHeaderedPanelまたはGroupBoxとして実装することで、GroupBoxのタイトルのラベルまたはHeaderedPanelの見出しを設定できます
メソッド 説明
IWTModule LoadModule(
IWTModule module,
IWTModule parentModule)
モジュールをアクティブモジュールとしてロードし、そのモジュールへの参照を返します。第2パラメータのparentModule,には、親のIWTModuleモジュール(このモジュールの起動元となるモジュール)への参照を指定します。つまりparentModuleパラメータでは、新しくロードしたモジュールの終了後にどのモジュールをアクティブにするかを制御できます。またparentModuleにはnullも指定できます。その場合は、現在のモジュールには親はないという意味になります。IWTWorkplaceの最初のモジュールの場合や、これまでにロードした他のモジュールとの間に依存関係がない場合には、nullを指定するとよいでしょう
IWTModule LoadModule(
  IWTModule module,
  IWTModule parentModule,
  bool loadVisible);
上のメソッドとほぼ同じですが、非表示でのモジュールのロードにも対応している点が異なります。ロードしたモジュールを表示する前にプログラムで追加的な処理が必要な場合には、非表示でのロードが便利です
void ShowModule(
  IWTModule module);
ロード済みのモジュールをアクティブ化します
bool CheckModuleExists(
  IWTModule module);
指定したモジュールがIWTWorkplaceに読み込み済みかどうかをチェックします
void RemoveModule(
  IWTModule module);
指定のモジュールをIWTWorkplaceから削除します
void HideAllModules(); 全モジュールを非表示にします
表2 IWTModuleインターフェースのプロパティとメソッド(各モジュールコンポーネントはこのインターフェースを実装する必要がある)
プロパティ 説明
IWTModule CallerModule
  { get; set; }
呼び出し元のモジュールへの参照を取得または設定します。呼び出し元のモジュールのプロパティやメソッドにアクセスするときに使用できます
IWTWorkplace HostWorkplace
  { get; set; }
モジュールをロードしたワークプレースコンポーネントへの参照です
メソッド 説明
void Refresh(
  WTCancelGenericEventArgs e)
このメソッドは、IWTWorkplaceコンポーネントがモジュールを終了して呼び出し元モジュールに制御を返すときに呼び出す必要があります。モジュールの終了時にはCloseイベントが発生し、WTCancelGenericEventArgs型の引数が渡されます。ワークプレースはRefreshメソッドを呼び出して、この引数を呼び出し元のモジュールに渡します
event WTCancelGenericEventHandler Close; IWTModuleの終了時に発生するイベントです

 IWTModuleとIWTWorkplaceの間のやり取りを制御するのがWTWorkplaceControllerクラスです。表3に示す静的メソッドのみを持ち、モジュールとワークプレースの橋渡しとなります。

表3 WTWorkplaceControllerの静的メソッド(WTWorkplaceControllerは静的メソッドのみを公開)
メソッド 説明
public static
 IWTModule LoadModule(
   IWTWorkplace workplace,
   IWTModule module,
   IWTModule parentModule,
   bool loadVisible)
ワークプレースにモジュールをロードします。親モジュール(現在のモジュールの起動元のモジュール)の指定と、ロードするモジュールの表示/非表示の指定も可能です
public static
 void ShowModule(
   IWTWorkplace workplace,
   IWTModule module)
ワークプレースにロード済みのモジュールを表示します
public static
 void RemoveModule(
   IWTWorkplace workplace,
   IWTModule module)
ワークプレースからモジュールを削除します
public static
 void HideAllModules(
   IWTWorkplace workplace)
ワークプレースの全モジュールを非表示にします
public static
 bool CheckModuleExists(
   IWTWorkplace workplace,
   IWTModule module);
モジュールがワークプレースにロード済みかどうかを調べます

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ワークプレースとモジュールのクラスの使用例

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Bogdan Zamfir(Bogdan Zamfir)

 コンピュータ科学で修士号を取得。1993年から独立系コンサルタント兼ソフトウェア開発者として活躍する。Webアプリケーションとデスクトップアプリケーションの両方を手がける。使用言語とプラットフォームは、C#、VB.NET、Visual FoxPro、Microsoft Access、Visual ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4395 2009/09/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング