連載:アプリケーション・アーキテクチャ・ガイド2.0解説第5回 典型的なアプリケーションのパターン(前編) 日本ユニシス 猪股 健太郎2009/10/16 |
|
本連載で要約している「patterns & practices: Application Architecture Guide 2.0(The Book)」のMS Press書籍版である「Microsoft Application Architecture Guide, 2nd Edition」(英語)がMSDN上に正式公開されました。その概要や本コンテンツからの変更点について、本連載の最終回で紹介する予定です。 |
本連載の第2回から第4回にかけて、アプリケーション・アーキテクチャ・ガイド(以下、AAG)に記されている以下のポイントを一通り説明してきた。
- アプリケーション種別
- アーキテクチャ・スタイル
- ホット・スポット
- 論理階層(レイヤ)とコンポーネント
- 物理階層(ティア)と配置シナリオ
今回の第5回と次回の第6回では、視点を変えてアプリケーション種別ごとにアーキテクチャ設計を説明していくことにする。ただし、これまでに説明した内容と共通する部分は控えめにし、説明を省いていた部分、特にパターンやベストプラクティスや実装テクノロジを重視した説明とする。
今回は、AAGの15〜17章に当たる、「Webアプリケーション」「RIA」「リッチ・クライアント・アプリケーション」について説明する。
■Webアプリケーション
Webアプリケーションは、クライアント上のWebブラウザとサーバ上のロジックとがやり取りを行うクライアント・サーバ型のアプリケーションである。
典型的な例では、Webサーバ上にプレゼンテーション層、ビジネス層、データ・アクセス層の3つの論理階層(レイヤ)が置かれる。また、JavaScriptやブラウザ・プラグインを利用して、プレゼンテーション・ロジックの一部をクライアント上で実行させる場合もある。
Webアプリケーションの典型的な構造 |
Webアプリケーションにおいて特別な考慮を必要とするアーキテクチャ・フレームとして、AAGでは下記のものを取り上げ、検討すべきガイドラインを提示している。ここでは、その中から「キャッシュ化」「ナビゲーション」「画面レイアウト」「プレゼンテーション・エンティティ」「要求処理」「セッション管理」の6つを説明しよう。
Webアプリケーションのアーキテクチャ・フレーム |
認証 |
承認 |
キャッシュ化 |
例外管理 |
ログ出力と計測 |
ナビゲーション |
画面レイアウト |
画面出力 |
プレゼンテーション・エンティティ |
要求処理 |
サービス・インターフェイス |
セッション管理 |
入力値検証 |
プレゼンテーション層 |
ビジネス層 |
データ・アクセス層 |
サービス層 |
テスト容易性 |
パフォーマンス |
セキュリティ |
●キャッシュ化
データや出力をキャッシュしておくことで、データの検索を高速にしたり、ネットワーク越しの通信のオーバーヘッドをなくしたりして、不必要な処理を排除することができる。ただし、不適切なキャッシュは逆にパフォーマンスに悪影響を与えるため注意が必要である。
注意点:
- よく変更されるデータはキャッシュしない。
- データをキャッシュするときは、すぐ利用できる形式でキャッシュしておく。
- 比較的静的なページでは、出力そのものをキャッシュする。
- ネットワーク接続などの共有リソースはキャッシュではなくプールする。すなわち、使い終わったら速やかに返却して再利用する。
- もし更新データをWebサーバでキャッシュするのであれば、Webサーバがステートレスにならない。そのため、Webファーム構成をとる場合には同じクライアントからの要求を単一サーバに振り分ける(サーバ・アフィニティ)必要が出てくる。
関連するパターン:
●ナビゲーション
画面遷移のナビゲーションに一貫した構造を持たせることで、ユーザーの混乱を防ぎ、ユーザビリティを向上させることができる。
注意点:
- ナビゲーションはビジネス・ロジックとは分離して設計する。
- ハイパーリンク、メニュー、パンくずナビゲーションのように、視覚的な要素を取り入れる。
- リンクをハードコーディングしない。
- 入力フォーム間の遷移にはウィザードの採用を検討する。
関連するパターン:
- モデル・ビュー・コントローラ
- Model-View-Presenter(英語)……モデル・ビュー・コントローラの派生パターン。プレゼンターは入力処理と出力加工の2つの責務を持つ。
●画面レイアウト
UIロジックと画面レイアウトを分離して設計することで、保守性を高くすることができる。
注意点:
- 可能な限りレイアウトを共通化する。
- 可能な限りカスケーディング・スタイルシート(CSS)を使ってレイアウトする。
- 格子状のレイアウトにはHTMLの<table>タグを使ったレイアウトを採用してもいいが、その場合には、出力が遅かったり、ブラウザ互換性が完全ではなかったり、複雑なレイアウトで問題が出たりする危険性に注意する。
関連するパターン:
●プレゼンテーション・エンティティ
プレゼンテーション層のビューを管理するデータを格納する。これはオプションであり、必要がなければ採用しなくてよい。
注意点:
- 表示するデータやフォーマットがプレゼンテーションに特有のものであれば採用を検討する。
- ネットワーク越しにやり取りしたり、永続化したりする場合はシリアライズ可能にしておく。
- データ検証ロジックを実装する。
関連するパターン:
●要求処理
アプリケーションへの要求をどのように取り扱うかを決定する。UIのビューやロジックとは分離して設計する。
注意点:
- すべての要求に共通する前処理と後処理があれば1個所に集約する。
- UI処理は、「モデル・ビュー・コントローラ」パターンや「モデル・ビュー・プレゼンター」パターンを用いて、ロジック/表示/制御の3つの役割に分解することを検討する。
- 大量データを表示するビューでは、監視コントローラ(Supervising Controller)パターンを検討する。
- 要求処理を後から追加できるようにしたい場合は、受信フィルタ(Intercepting Filter)パターンを検討する。
関連するパターン:
●セッション管理
Webアプリケーションでは、ブラウザからの一連の要求をまたがって維持される内部状態をセッション状態と呼ぶ。セッション状態として、どこに何を保持し、いつまで保持し続けるのかという方針を定める必要がある。
注意点:
- 応答速度を向上させたい場合は、インプロセスでセッション状態を管理する。ただし、サーバ・アフィニティが必要になるうえ、ASP.NETワーカー・プロセスが再起動されるとセッション状態も失われる。
- ASP.NETワーカー・プロセスの再起動に対応したい場合は、Webサーバ上で動作するセッション状態サービスを利用できる。ただし、サーバ・アフィニティが必要になる。
- サーバ・アフィニティを前提としないWebファーム構成では、外部サーバで動作するセッション状態サービスを利用する。ただし、ネットワーク通信のオーバーヘッドが発生する。
- セッション・データには単純な型を使う。
- セッション状態を外部サーバで管理する場合は、通信チャネルの保護を検討する。
■
Webアプリケーションのまとめとして、Webアプリケーションの構築に利用できる実装テクノロジを表にまとめる。要件や制約に応じて使い分けるとよい。
テクノロジ | 利用シナリオ |
ASP.NET Webフォーム | 一般的なWebアプリケーションを構築する場合 |
ASP.NET AJAX | 対話性を良くしたり、バックグラウンドでの処理によってページ・リロードを少なくしたい場合 |
ASP.NET + Silverlightコントロール | リッチ・メディア・コンテンツをサポートしたり、対話性を部分的に良くしたい場合 |
ASP.NET Dynamic Data | データベースに格納しているデータ・モデルを反映した画面からなる、データ駆動型Webアプリケーションを構築する場合 |
ASP.NET MVC (*注) | UIロジックから見た目を分離し、テスト容易性を高める場合 ただし、ASP.NET Webフォーム用サーバ・コントロールは一部の例外を除いて利用できない |
マスターページ | ASP.NET Webフォームにおいて、すべてのページの見た目に一貫性を持たせたい場合 |
Webアプリケーションの構築に利用できる実装テクノロジ | |
(*注) AAGのベータ版には含まれていたASP.NET MVCについての言及が、2009年3月公開の安定版からは削除されている。しかし、ASP.NET MVCはVisual Studio 2010に統合される予定であるため、本稿ではあえて取り上げている。 |
INDEX | ||
連載:アプリケーション・アーキテクチャ・ガイド2.0解説 | ||
第5回 典型的なアプリケーションのパターン(前編) | ||
1.Webアプリケーション | ||
2.RIA(リッチ・インターネット・アプリケーション) | ||
3.リッチ・クライアント・アプリケーション | ||
「アプリケーション・アーキテクチャ・ガイド2.0解説」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|