アスペクト 指 向 ソフトウェア 開 発 方 法 論 北 陸 先 端 科 学 技 術 大 学 院 大 学 情 報 科 学 研 究 科 落 水 浩 一 郎
関 心 事 とは 関 心 事 利 害 関 係 者 (エンドユーザー プロジェクトスポンサー 開 発 者 )が 関 心 をもつあらゆること 機 能 要 求 非 機 能 要 求 設 計 制 約 など 関 心 事 の 分 離 問 題 を 分 解 して 小 さくすること 理 想 的 にはさまざまな 関 心 事 をなんらかのモジュールに 明 確 に 分 離 し 各 モジュールを 個 別 に 検 討 し 開 発 したい 横 断 的 な 関 心 事 複 数 のコンポーネント(クラス パッケージ サービス)に 影 響 をお よぼす 関 心 事 横 断 的 関 心 事 の 種 類 基 盤 的 な 関 心 事 ロギング 分 散 処 理 トランザクション 管 理 など 機 能 的 関 心 事 ユースケース
とくに2 種 類 の 横 断 的 関 心 事 に 注 目 する ピアの 分 離 不 能 もつれあい と ちらばり 拡 張 の 分 離 不 能 基 底 グルーコード 部 屋 の 予 約 拡 張 顧 客 のチェック インを 行 う 顧 客 画 面 部 屋 の 予 約 予 約 キャンセル 待 ち リスト <<extend>> 顧 客 のチェック アウトを 行 う スタッフ 画 面 チェックイン 部 屋 チェックアウト キャンセル 待 ち リストを 扱 う 関 心 事 コンポーネント
アスペクトによる 問 題 への 取 り 組 み アスペクト 指 向 横 断 的 関 心 事 の 分 離 を 向 上 を 目 的 とした 技 術 群 1997 年 Xerox ParcのGregor Kiczales がOOPSLA 97で AOPに 関 する 基 調 講 演
インタータイプ 宣 言 クラスに 新 しい 操 作 やフィールドを 追 加 する(クラス 図 が 変 更 される) 1. public aspect Logging{ 2. public void Room.extractData(){ 3. // コード 4. } 5. } クラス 拡 張 <<aspect>> Logging Room 操 作 extractdata() この 操 作 の 記 述 は アスペクトがRoom ( 部 屋 )クラスに ExtraData()を 追 加 することを 表 す
アドバイス 振 る 舞 いが 追 加 される(メソッドの 振 る 舞 いが 追 加 される) logdataという 操 作 拡 張 を ReserveRoomHandlerクラスのmakeReservation()と いう 操 作 の 中 の メソッド 呼 び 出 しRoom.retrieve()の 前 に 追 加 する 1. Public aspect Logging { 2. before () : 3. withincode(void ReservationRoomHandler.makeReservation( ) ) 4. && call(void Room.retrieve( )) { 5. // コード 6. } 7. } クラス 拡 張 <<aspect>> Logging ReserveRoomHandler 操 作 makereservation(){ before(call(room.retrieve())) logdata}
ポイントカット logdataという 操 作 拡 張 を ReserveRoomHandlerクラスのなんらかの 既 存 の 操 作 に(この 定 義 は<room-AccessOp>によってパラメータ 化 されていて 操 作 拡 張 の 構 造 コンテキストを 形 成 しています)Roomクラスの 操 作 を 呼 び 出 す 部 分 が あった 場 合 その 直 前 に(この 定 義 は<roomCall>によってパラメータ 化 されて いて 操 作 拡 張 の 振 る 舞 いコンテキストを 形 成 しています) 追 加 します クラス 拡 張 <<aspect>> Logging ポイントカット roomaccessop = *(..) 構 造 コンテキストの 名 前 roomcall = call(room.*(..)) 振 る 舞 いコンテキストの 名 前 ReserveRoomHandler 操 作 <roomaccessop>(){ before (<roomcall>) logdata}
アスペクトによるピアの 分 離 1. public aspect CheckInCustomer { 2. 3. public void Room.assignCustomer() { // 顧 客 をチェックインさせるコード} 4. public void Reservation.consume() { // 予 約 を 消 化 するコード} 5. public void Payment.createBill() { // 最 初 の 未 払 い 請 求 書 を 作 成 するコード} 6. } Room Reservation Payment checkavailability() create() 顧 客 のチェックインを 行 う assigncustomer() consume() createbill() 顧 客 のチェックアウトを 行 う removecustomer() paybill()
アスペクトによる 拡 張 の 分 離 1. 振 る 舞 いを 拡 張 すべき 既 存 の 操 作 内 にある 拡 張 ポイントを 識 別 する 2. それらの 拡 張 ポイントにおいて 振 る 舞 いを 拡 張 するために 使 用 される 追 加 の 振 る 舞 いを 定 義 する makereservation makereservation 1 空 き 部 屋 が あるか? [Y] [N] 予 約 を 作 成 する 空 き 部 屋 なし 2 1 アクセスが 許 可 されたか? [Y] 空 き 部 屋 が あるか? [Y] [N] [N] 予 約 を 作 成 する 認 可 エラー 顧 客 をキャンセル 待 ちリストに 入 れる 2 makereservation 操 作 認 可 とキャンセル 待 ちリストの 機 能 で 修 正 されたmakeReservation
対 応 するソースコード ReservationRoomHandlerの 簡 単 なソースコード 1. Class ReserveRoomHandler{ 2. 3. public void makereservation() throws NoRoomException { 4. if( theroom.getquantityavailable() <=0) { throw new NoRoomException(); } 5. createreservation(); 6. } 7. 8. } キャンセル 待 ちリストを 扱 う の 簡 単 なソースコード 1. aspect HandleWaitingList { 2. 3. pointcut makingreservation(); 4. execution (void ReserveRoomHandler.makeReservation()); 5. 6. after throwing (NoRoomException e) ; makingreservation() { 7. // 顧 客 をキャンセル 待 ちリストに 追 加 するコード 8. } 9. }
ユースケーススライス ユースケーススライスは 一 つのモデル( 分 析 モデルや 設 計 モデルな どがある) 内 のユースケース 実 現 の 詳 細 を 保 持 する 具 体 的 には ユースケースに 依 存 するクラスやクラスのアスペクトが 含 まれてい る ユースケーススライスには 相 互 作 用 図 コミュニケーション 図 クラス 図 などを 用 いてユースケースの 実 現 を 表 現 したコラボレ ーションを 含 めることもできる ユースケース 独 立 スライスとは システムの 要 素 構 造 へクラスを 割 り 当 てるだけのユースケーススライスである ユースケース 独 立 ス ライスはアスペクトを 含 まない ユースケースモジュールは 一 つのパッケージに 関 係 するすべて のものを 局 在 化 したもの ユースケースモジュールには 多 くのユ ースケーススライスが 含 まれる
ユースケーススライスによるピアユースケース 実 現 の 構 成 ユースケース ユースケース 実 現 に 特 化 したクラスの 振 る 舞 いの 拡 張 ユースケーススライス 顧 客 のチェックインを 行 う ユースケーススライス 顧 客 のチェック インを 行 う 顧 客 のチェックアウトを 行 う ユースケーススライス 顧 客 のチェック アウトを 行 う + 顧 客 のチェックインを 行 う+ 顧 客 のチェッ クアウトを 行 う 顧 客 画 面 スタッフ 部 屋 の チェック 画 面 北 陸 先 端 予 大 約 落 水 浩 一 イン 郎 チェック アウト 予 約 部 屋
拡 張 ユースケース 実 現 と 基 底 ユースケース 実 現 の 構 成 ユースケース ユースケースを 実 現 するクラスの 振 る 舞 いの 拡 張 ユースケーススライス キャンセル 待 ちリストを 扱 う ユースケーススライス キャンセル 待 ち リストを 扱 う ポイントカットによって 定 義 された 箇 所 に 追 加 される 操 作 拡 張 +キャンセル 待 ちリストを 扱 う 顧 客 画 面 部 屋 の 北 陸 予 約 予 先 約 端 大 落 水 浩 一 郎 部 屋 キャンセル 待 ちリスト
ユースケース 駆 動 と 連 携 したアスペクト 定 義 ユースケースによる 関 心 事 のモデル 化 と 捕 捉 アプリケーションユースケースの 捕 捉 基 盤 ユースケースの 捕 捉 ユースケースモジュールによる 関 心 事 の 分 離 アスペクトによるピアユースケースの 実 現 の 分 離 ポイントカットによる 拡 張 の 分 離 ユースケースモジュールによるシステムの 構 築 ユースケースとアスペクトによるアーキテクチャの 確 立 適 応 性 のあるアーキテクチャの 確 立 アプリケーション 勝 町 ユースケースによる 機 能 要 求 の 分 離 基 盤 ユースケースによる 非 機 能 要 求 の 分 離 プラットフォーム 依 存 ユースケースによるプラットフォーム 依 存 部 の 分 離 ユースケーススライスによるテストの 分 離
ユースケースによる 関 心 事 の 捕 捉 利 害 関 係 者 の 関 心 事 の 理 解 問 題 領 域 の 理 解 (ドメインクラス) システムのフィーチャの 洗 い 出 し 機 能 要 求 と 非 機 能 要 求 の 扱 い アプリケーションユースケースの 捕 捉 ユースケース 変 更 可 能 性 の 識 別 ユースケース 可 変 性 の 扱 い 拡 張 ユースケースの 扱 い 基 盤 ユースケースの 捕 捉 トランザクションを 実 行 する ユースケース 基 盤 ユースケースの 構 造 化 基 盤 ユースケースの 記 述 システム 全 体 にまたがる 関 心 事 の 扱 い
ホテル 管 理 システムのドメインクラス 顧 客 部 屋 予 約 特 典 請 求 書
ホテル 管 理 システムの 主 要 なフィーチャー 1. 顧 客 は ホテルの 部 屋 を 予 約 できる 2. カウンタスタッフは 顧 客 のチェックインとチェックアウトを 行 える 3. ホテル 管 理 者 は 部 屋 の 標 準 料 金 と 特 定 の 期 間 において 値 下 げする 際 の 特 典 価 格 を 設 定 できる 4. メンバー 会 員 は 利 用 ポイントを 貯 めてさまざまな 支 払 に 利 用 できる 5. 部 屋 がすべて 予 約 済 みの 場 合 は キャンセル 待 ちリストを 利 用 できる 6. さまざまなタイプの 顧 客 ( 個 人 法 人 メンバー 会 員 )を 取 り 扱 う 必 要 がある 7. 代 理 店 インターネット 電 話 といったさまざまなチャネルを 通 して 部 屋 を 予 約 できる 8. システムはWebから 利 用 できる 必 要 がある 9. システムは リレーショナルデータベースにすべての 記 録 を 保 持 する 10. 監 査 上 の 目 的 から システムの 処 理 のログを 残 す 必 要 がある 11. 認 可 された 人 だけが これらの 機 能 を 実 行 できる 12. 利 便 性 を 向 上 させるために ユーザの 嗜 好 を 記 録 してデフォルトとして 用 いる 13. あらゆる 記 録 の 取 出 しに2 秒 以 上 かけるべきでない
ホテル 管 理 システムのアプリケーションユースケース <<extend>> キャンセル 待 ちリスト を 扱 う 顧 客 ポイントを 獲 得 し 使 用 する ホテル カウンタ スタッフ メンバー 会 員 を 登 録 する 顧 客 のチェックイン を 行 う メンバー 会 員 ホテル 管 理 者 部 屋 の 料 金 を 設 定 する <<extend>> <<extend>> 顧 客 のチェックアウト を 行 う 部 屋 の 特 典 料 金 を 設 定 する
ユースケース 変 更 可 能 性 の 識 別 と 可 変 性 の 取 り 扱 い 繰 り 返 し 期 間 予 約 期 間 複 数 期 間 単 一 期 間 個 人 法 人 顧 客 のタイプ インターネット 代 理 店 電 話 予 約 チャネル
拡 張 ユースケースの 扱 い ポイントを 獲 得 し 使 用 する フロー {basic} ポイント 残 高 を 見 る {basic} ポイントを 使 用 する {alt} ポイントで 支 払 う{around MakingPayment} {alt} ポイントを 獲 得 する{after MakingPayment} 拡 張 ポイントカット MakingPayment = 顧 客 のチェックアウトを 行 う 支 払 を 徴 収 する
基 盤 ユースケースの 捕 捉 と 構 造 化 <<extend>> 認 可 処 理 をする <アクター> トランザクショ ンを 実 行 する <<extend>> トランザクション を 監 視 する <<extend>> 嗜 好 を 把 握 する
アスペクトによるピアユースケースの 実 現 の 分 離 ピアユースケースの 実 現 ピアユースケースの 実 現 ユースケースの 実 現 ピアユースケース 実 現 間 の 重 複 ユースケース 依 存 部 の 分 離 ユースケース 依 存 クラスの 構 成 ユースケース 依 存 クラス 拡 張 の 構 成 重 複 の 取 り 扱 い 包 含 されるユースケーススライス 汎 用 ユースケーススライス ユースケース 独 立 スライス
ピアユースケース 顧 客 ホテル カウンタ スタッフ 顧 客 のチェックイン を 行 う
ユースケースの 実 現 システム 外 部 の 観 点 システム 内 部 の 観 点 コラボレーション 役 割 実 現 関 係 Room リソースの 役 割 を 担 う 部 屋 クラス リソース 操 作 updateavailability() retrieve() 役 割 を 果 たすために 必 要 なクラス 拡 張 コントローラ リソース ReserveRoomHandler 操 作 makereservation() Room 操 作 updateavailability() retrieve()
ピアユースケース 実 現 部 の 重 複 コントローラ リソース ReserveRoomHandler 操 作 makereservation() Room 操 作 updateavailability() retrieve() コントローラ 顧 客 の チェックイン を 行 う リソース 操 作 checin() CheckInHandler Room 操 作 assignlodger() retrieve()
ユースケース 依 存 部 の 分 離 ユースケーススライスとアスペクトによるユースケースのモジュール 性 の 維 持 <<use case slice>> <<aspect>> ReserveRoom クラス 拡 張 ReserveRoomHandler 操 作 makereservation() Room 操 作 updateavailability()
要 素 構 造 とユースケーススライス 要 素 構 造 ユースケーススライス アプリケー ション レイヤー <<use case slice>> 構 成 する クラス 拡 張 ドメイン レイヤー 構 成 する 要 素 構 造 は モデル 内 の 要 素 が 存 在 する 場 所 を 識 別 するための 手 段 でしかない 要 素 の 内 容 ( 振 る 舞 い)はコンポジションの 際 にユースケーススライスによって 埋 められる
ユースケーススライスにおけるクラスの 設 計 要 素 構 造 への 重 ね 合 わせ 設 計 要 素 構 造 ユースケーススライス アプリケー ション レイヤー <<use case slice>> 合 成 する コラボレーション アスペクト ドメイン レイヤー クラス 設 計 要 素 におけるReserveRoomHandler クラス(もともとは 空 ) ユースケーススライスにおける ReserveRoomHandlerクラス
ユースケーススライスにおけるクラス 拡 張 の 設 計 要 素 構 造 への 重 ね 合 わせ 設 計 要 素 構 造 ユースケーススライス アプリケー ション レイヤー <<use case slice>> コラボレー ション アスペクト ドメイン レイヤー 合 成 する クラス 設 計 要 素 におけるRoomクラス 設 計 要 素 構 造 に 追 加 される Roomクラス 拡 張
重 複 の 取 り 扱 い Roomクラスのretrieve() 操 作 は と 顧 客 のチェック インをする という 両 方 のユースケーススライスで 利 用 される <<include>> 部 屋 の 詳 細 を 確 認 する <<use case slice>> <<aspect>> ReserveRoom クラス 拡 張 <<include>> 部 屋 の 詳 細 を 確 認 する <<use case slice>> 部 屋 の 詳 細 を 確 認 する <<aspect>> CheckRoomDetail ReserveRoom Handler makereserva tion() Room updateavail ability() checkroom Handler retrieve Room() Room retrieve()
拡 張 ユースケース 実 現 のモジュール 性 の 維 持 顧 客 ホテルカウン タスタッフ 対 象 顧 客 のチェック インを 行 う ロギング <<extend>> <<extend>> ロガー ロギング ReserveRoomHandler LogStream
ポイントカット 区 画 を 伴 うロギングユースケーススライス <<use case slice>> ロギング ロギング LogStream log() <<aspect>> ロギング クラス 拡 張 ReserveRoomHandler 操 作 makereservation(){after call (Room.retrieve()) logdata} <<use case slice>> ロギング ロギング <<aspect>> ロギング ポイントカット roomcall = call(room.retrieve()) log() LogStream クラス 拡 張 ReserveRoomHandler 操 作 makereservation(){after (<roomcall>) logdata}
設 計 モデルと 実 装 モデル プラットフォームに 依 存 する 事 柄 を 表 現 するために 設 計 モデルにはさらに 多 くの 構 成 要 素 を 含 める 必 要 がある 配 置 構 造 ノードとリンク プロセス 構 造 スレッド 設 計 要 素 構 造 レイヤー サブシステム パッケージに 体 系 化 された 設 計 クラス ユースケース 設 計 構 造 ユースケース 設 計 構 造 は 設 計 要 素 構 造 にまたがり 直 交 して 作 用 する ユースケーススライス アスペクト クラス 拡 張 などから なる
設 計 モデルにおける 分 析 モデルの 構 造 維 持 分 析 モデル 設 計 モデル プラットフォーム 独 立 構 造 <<trace>> 最 少 設 計 部 プラットフォーム 依 存 部 最 少 設 計 部 における 北 陸 先 端 大 落 水 浩 ステレオタイプのアイコン 一 郎
モデルを 横 断 するユースケースモジュール ユースケース 分 析 モデル 設 計 モデル 実 装 モデル モデル ユースケースモジュール ユースケース 仕 様 スライス <<trace>> 分 析 スライス <<trace>> 設 計 スライス <<trace>> 実 装 スライス <<trace>> <<trace>> <<trace>> <<trace>> テスト 設 計 スライス <<trace>> テスト 実 装 スライス
ユースケースからユースケースモジュールを 抽 出 施 設 を 予 約 する <<use case module>> 施 設 を 予 約 する 部 屋 を 予 約 する <<extend>> キャンセル 待 ち リスト 扱 う <<generalize>> <<extend>> <<use case module>> キャンセル 待 ち リストを 扱 う <<include>> 部 屋 の 詳 細 を 確 認 する <<use case module>> <<include>> <<use case module>> 部 屋 の 詳 細 を 確 認 する ユースケースモジュールの 構 成 <<merge>> <<use case module>> <<merge>> <<use case module>> キャンセル 待 ちリストを 扱 う <<use case module>> ビルド1 <<merge>> <<use case module>> 顧 客 のチェックインを 行 う
良 いアーキテクチャとは 機 能 要 求 の 分 離 各 機 能 要 求 は 異 なるエンドユーザの 関 心 事 を 表 しており 別 々 に 発 展 するものである 非 機 能 要 求 と 機 能 要 求 の 分 離 非 機 能 要 求 は 通 常 システムに 要 求 される 品 質 特 性 を 記 述 する ものであり 基 盤 メカニズムによって 規 定 される プラットフォーム 依 存 部 の 分 離 認 可 のような 基 盤 メカニズム 一 つをとっても さまざまな 選 択 肢 (HTTPクッキー セッション 識 別 子 など)がある これらの 技 術 はプラットフォーム 依 存 であったりベンダー 依 存 であったり する 分 離 する 必 要 がある テスト 対 象 とテストの 分 離 テストの 一 部 として 制 御 と 計 測 (デバッグ トレース ロギ ングなど)を 実 行 する 必 要 がある 実 行 後 に 取 り 除 くため 分 離 する 必 要 がある
プラットフォーム 独 立 の 要 素 構 造 要 素 構 造 :システムの 要 素 を 配 置 する 名 前 空 間 を 識 別 レイヤー: 同 じ 抽 象 化 レベルの 要 素 をグループ 化 するのに 使 用 する アプリケーションレイヤー:システムの 主 要 なアクターをサ ポートするユースケース ドメインレイヤー:ドメインに 関 する 重 要 な 概 念 を 表 す 要 素 ユースケース 構 造 : 要 素 構 造 にどのように 機 能 を 割 り 当 てるかを 決 定 する ユースケーススライスとユースケース 独 立 ス ライスがある アプリケーション レイヤー 顧 客 アプリケーション カウンタスタッフ アプリケーション 管 理 者 アプリケーション ドメインレイヤー 予 約 管 理 部 屋 管 理 再 利 用 性 大 要 素 構 造 における 初 期 のレイヤーとパッケージ
ユースケース 構 造 ユースケース 独 立 のスライスを 左 に ユースケース 依 存 のスライスを 右 に <<non-uc specific slice>> 顧 客 アプリケーション <<extend>> <<use case slice>> <<non-uc specific slice>> ホテル 予 約 <<non-uc specific slice>> <<extend>> <<use case slice>> 顧 客 の チェックインを 行 う カウンタアプリケーション <<extend>> <<use case slice>> 顧 客 の チェックアウトを 行 う
プラットフォーム 依 存 要 素 の 重 ね 合 わせ リクエストを 送 る : 電 話 リクエストを 処 理 する : 顧 客 : ホテル カウンタ スタッフ : ホテル 管 理 者 リクエストを 送 る リクエストを 送 る リクエストを 送 る : 顧 客 PC HTML : スタッフPC Java Swing, AspectJ : スタッフPC Java Swing, AspectJ リクエストを 処 理 する HTTP RMI リクエストを 処 理 する RMI RMI : アプリケー ションサーバー J2EE, AspectJ リクエストを 処 理 する データにアクセスする JDBC ホテル 管 理 システムの 設 計 モデルの 配 置 構 造 : データ ベース SQL
ホテル 管 理 システムのプロセス 構 造 : 顧 客 : ホテル カウンタ スタッフ <<node>> 顧 客 PC <<process>> ブラウザ <<node>> スタッフPC <<process>> シック クライアント HTTP RMI <<node>> アプリケーション サーバー <<process>> Webコンテナ RMI <<process>> EJBコンテナ JDBC <<node>> データベース サーバー <<process>> リレーショナル データベース
プラットフォーム 依 存 構 造 を 分 離 した ユースケースの 設 計 スライス <<use case slice>> ユースケース 設 計 スライス <<use case slice>> 最 少 ユースケース 設 計 <<extend>> <<extend>> <<use case slice>> プレゼンテーション 処 理 のユースケース <<use case slice>> 永 続 化 処 理 の ユースケース <<extend>> <<use case slice>> 分 散 処 理 の ユースケース