GluonJ を用いたビジネスロ ジックからのデータベースアク セスの分離 東京工業大学 情報理工学研究科 数理・計算科学専攻 石川 零 千葉 滋 SPA '05, Ikaho, Gunma 1 コンポーネント間の依存関係 コンポーネント間の依存関係を弱める技術が注 目されている : Design Patterns Dependency Injection Aspect Oriented Programming (AOP) …と我々 は 考えてい る 横断的関心事を実装するコンポーネントと、他のコンポーネ ントの間の依存関係を弱める 仕様変更による、コンポーネントの追加や取り外しを容易に する SPA '05, Ikaho, Gunma 2 依存関係を弱めたい例 Database Access Object (DAO) Service オブジェクトとの依存関係 同じセッションに属す Service オブジェクトは同一の DAO と 結びつける 横断的関心事の一種 DAO 例: SPAの論文投稿システム 著者登録 論文投稿 著者登録 Service DAO データ ベース Service Service SPA '05, Ikaho, Gunma DAO これは典型的な Web ア プリケーションの構成 3 Dependency Injection (DI) コンテナの 利用 サービスオブジェクトからDAO の生成を分離 DI コンテナ: DAO を生成してService オブジェクトへ与える Service オブジェクトはインタフェースを介してDAO を操作 欠点: サービスオブジェクトの再利用性は低い 決められたインタフェースを実装しないオブジェクトとは一緒に 使えない DI コンテナによる注入 AuthorCheckService OracleDAO MySQLDAO DAO dao; MailTransferAgent SPA '05, Ikaho, Gunma 4 提案するAOP 言語 : GluonJ アスペクト指向の利用 コンポーネント同士の結びつけに利用 依存関係の記述をコンポーネントから完全に除去 AuthorCheckService DAO PaperCheckService DAO AuthorCheckService アスペクトが Service オブジェクトと DAO を結ぶ SPA '05, Ikaho, Gunma 5 GluonJ のアスペクト 大きく2つの要素から構成 Service オブジェクトから DAO へのリンクの宣言 DAO の呼び出しの記述 AspectJ のポイントカット&ア ドバイスと似た記述 アスペクト (XML で記述) リンクの宣言 <aspect> <injection> DAO AuthorCheckService.aspect = DAO.factory (this.sessionId); </injection> <advice> <pointcut> execution ( void AuthorCheckService. checkAuthorInfo(..)) </pointcut> <after> DAO.aspectOf (this). postAuthor ( this.firstname, this.lastname); </after> </advice> DAO の </aspect> 呼び出し SPA '05, Ikaho, Gunma 6 リンクの宣言 Service オブジェクトからDAO へのリンクを追加 Service オブジェクトが生成されたときに、DAO オブ ジェクトを生成して結びつける リンク元コンポーネント <injection> DAO AuthorCheckService.aspect = DAO.factory (this.sessionId); </injection> リンク先コンポーネント SPA '05, Ikaho, Gunma 7 DAO の呼び出し リンクしたDAO を呼び出す Service オブジェクトのメソッド呼び出しのあとに、 DAO のメソッドを呼び出す AspectJ のポイント カット& アドバイスに似 た記述 aspectOf メソッド: this と リンクする DAO オブジェクト を取得 <advice> <pointcut> execution (void AuthorCheckService. checkAuthorInfo(..)) </pointcut> <after> DAO.aspectOf (this).postAuthor (this.firstname, this.lastname); </after> </advice> SPA '05, Ikaho, Gunma 8 AspectJ では記述できないか? プログラミング idiom を駆使すれば可能 プログラムから開発者の設計意図(アーキテクチャ)を読み取り にくい AspectJ のデザイン 横断的関心事をアスペクトで直接実装する アスペクトは暗黙のうちに生成 (new できない) AuthorCheckService オブジェクト SID : 001 DAO をアスペクト として実装 AuthorCheckService オブジェクト SID : 002 PaperCheckService オブジェクト SID : 002 DAO DAO SPA '05, Ikaho, Gunma 9 AspectJ 実装 – issingleton + ハッシュ テーブル DAO をアスペクトとして記述 DAO アスペクトインスタンスを1つ用意 セッション ID ごとにまとめておきたいデータをハッ シュテーブル型のフィールドで管理 AuthorCheckService AuthorCheckService オブジェクト オブジェクト SID : 001 SID : 002 PaperCheckService オブジェクト ハッシュテーブル SID : 002 ID 001 002 DAO 問合せ SPA '05, Ikaho, Gunma 10 AspectJ 実装 – issingleton + インター タイプ宣言 DAO アスペクトインスタンスを1つ用意 DAOのフィールドのデータをインタータイプ宣言したフィールド に保存 インタータイプ宣言 他のクラスにフィールドやメソッドを追加する技術 AuthorCheckService AuthorCheckService オブジェクト オブジェクト SID : 001 SID : 002 PaperCheckService オブジェクト SID : 002 DAO SPA '05, Ikaho, Gunma 11 AspectJ 実装 – perthis の利用 サービスオブジェクトごとにアスペクトインスタンスを生成 perthis : 1つのオブジェクトに1つのアスペクトインスタンスを結び つける セッション ID ごとの結びつけは困難 AuthorCheckService AuthorCheckService オブジェクト オブジェクト PaperCheckService オブジェクト SID : 001 SID : 002 SID : 002 DAO DAO DAO SPA '05, Ikaho, Gunma 12 Association Aspects [Sakurai, ’04] の 利用 新しい言語機構を導入して AspectJ を拡張 アスペクトインスタンスを明示的に生成できる 結びつけのルールを新たに追加 下の設計を実現できる AuthorCheckService オブジェクト AuthorCheckService オブジェクト SID : 001 SID : 002 DAO PaperCheckService オブジェクト SID : 002 DAO SPA '05, Ikaho, Gunma 13 Dependency Reduction [ECOOP ’05] これが AOP の本質なのでは? コンポーネント間の依存関係を弱める技術が AOP GluonJ はこの認識に立って設計された言語 横断的関心事はAOPが役立つ応用例 横断的関心事: 他のコンポーネントの結びつきが元々弱く、 将来結びつきが変わる可能性が高い → 依存関係を弱める必要がある 横断的関心事の実装技術が AOP ではない SPA '05, Ikaho, Gunma 14 関連研究: Dependency Injection コンポーネント間の依存関係を、プログラムから 分離して記述する技術 DI コンテナ: コンポーネントの生成を分離 DI コンテナは、AOP言語のサブセットと見ること ができるのでは? GluonJ はコンポーネントの生成とメソッド呼び出しを プログラムから分離できる GluonJ はDI コンテナより強力 SPA '05, Ikaho, Gunma 15 まとめと今後の課題 まとめ GluonJ アスペクトをコンポーネント同士の結びつけに用いる 依存関係の記述をコンポーネントから完全に除去 今後の課題 AspectJ, Association Aspects との比較 GluonJ を用いたコンポーネントフレームワークの作 成 SPA '05, Ikaho, Gunma 16
© Copyright 2024 ExpyDoc