Document

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