seasar conference 2009 white - di

42
DIことはじめ - あなたのコードから new / if が消えます。魔法のDI - 都元ダイスケ 2009.3.14 Seasar Conference 2009 White

Upload: daisuke-miyamoto

Post on 28-Jan-2015

110 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Seasar Conference 2009 White - DI

DIことはじめ- あなたのコードから new / if が消えます。魔法のDI -

都元ダイスケ

2009.3.14 Seasar Conference 2009 White

Page 2: Seasar Conference 2009 White - DI

自己紹介

都元ダイスケ

http://d.hatena.ne.jp/daisuke-m

Jiemamy Project チーフコミッタ

DBの設計管理の敷居を下げるSeasar Project Doltengコミッタ

ゴメンナサイ ゴメンナサイ

Page 4: Seasar Conference 2009 White - DI

Agendaイントロ ~ 基礎知識の整理

依存性について

仕様と実装

いつDIが欲しくなるのか

Seasar2の基礎の基礎

ちょっとした応用

Page 5: Seasar Conference 2009 White - DI

今日はDIのお話

DI = Dependency Injection = 依存性注入

依存性を注入すること

そのメカニズムのこと

まずはDIは置いておき、基礎知識の整理を。

Page 6: Seasar Conference 2009 White - DI

Section 1イントロ ~ 基礎知識の整理

Page 7: Seasar Conference 2009 White - DI

依存性って?

自動車 → エンジン

エンジン → ガソリン

書籍 → 文字

iPod → Mac or PC

ソフトウェア → ハードウェア

Page 8: Seasar Conference 2009 White - DI

A → B

AはBがあって初めて動作する・意味を成す。

AはBがなければ動かない・意味がない。

Javaで言うと「AクラスがなければBクラスがコンパイルできない」のが依存。

Page 9: Seasar Conference 2009 White - DI

クラス同士の依存

Appクラスは、StringBuilder, String, Systemクラスに依存。

Page 10: Seasar Conference 2009 White - DI

依存は少ない方がいい

例えば StringBuilder#append(String)メソッドが廃止された!?

その途端、Appクラスは動かない

コンパイルさえ出来ない

依存性があると、依存先クラスの変更時に依存クラスに影響が出る

Page 11: Seasar Conference 2009 White - DI

抽象的なもの (abstract)依存は、より抽象的なものに対して

抽象的 ←→ 具体的

Page 12: Seasar Conference 2009 White - DI

ある乗り物の作成時…

「燃料」に依存する乗り物を作る

当初はレギュラーだったものが固形燃料に変わっても、その乗り物に影響はない。

「ハイオク」に依存する乗り物を作る

レギュラーになっただけで、乗り物の作りを変える必要あり。

Page 13: Seasar Conference 2009 White - DI

どちらが望ましい?

クラスよりもインターフェイスの方がより抽象的

Page 14: Seasar Conference 2009 White - DI

仕様と実装仕様の例

fooメソッドの結果、"Miyamoto Daisuke" という文字列が表示される

その実装の例

先ほどのStringBuilderのコードSystem.out.println("Miyamoto Daisuke");

StringBuilderに依存しない実装

Page 15: Seasar Conference 2009 White - DI

実装ではなく仕様に依存(1)

自動車 → エンジン ですが、幸いV型4気筒DOHCエンジンには依存していない

ハイブリッドエンジンでも車は動く自動車 uses エンジンV型4気筒DOHCエンジン implements エンジンハイブリッドエンジン implements エンジン

Page 16: Seasar Conference 2009 White - DI

つまり、インターフェイスだけで、その実装クラスが無くてもコンパイルできるように。

interfaceを使うと、仕様と実装が分離でき、実装に依存しないコードを書く事ができます…?

実装ではなく仕様に依存(2)

Page 17: Seasar Conference 2009 White - DI

実装ではなく仕様に依存(3)

Page 18: Seasar Conference 2009 White - DI

Section 2いつDIが欲しくなるのか

Page 19: Seasar Conference 2009 White - DI

そろそろお題を

Page 20: Seasar Conference 2009 White - DI

求める結果

CREATE TABLE T_USER ( ID INTEGER, USERNAME VARCHAR(32), PASSWORD VARCHAR(32));

Page 21: Seasar Conference 2009 White - DI

最低限の要求を満たすコード

Main

BusinessLogic

Converter

Page 22: Seasar Conference 2009 White - DI

ここで仕様変更ですよOracleにも対応してくれんかね。INTEGER → NUMBERVARCHAR → VARCHAR2

もちろん、今までの変換もできるようにね。

Page 23: Seasar Conference 2009 White - DI

依存性の切り離し現在 BL は Converter の実装に依存

仕様(=interface)に依存するように変更を加える

public class OriginalConverter implements Converterpublic class OracleConverter implements Converter

Page 24: Seasar Conference 2009 White - DI

Oracleに対応INTEGER → NUMBERVARCHAR(32) → VARCHAR2(32)

Page 25: Seasar Conference 2009 White - DI

これでBLはConverter実装無しでコンパイルができる…?

Page 26: Seasar Conference 2009 White - DI

じゃあさ、

Mainが_________を入手した時既に_________のインスタンスが______フィールドに入ってればいいんじゃない?

これがDIというものらしい

BusinessLogicConverter実装

converter

Dependency

Injection

Page 27: Seasar Conference 2009 White - DI

Section 3Seasar2の基礎の基礎

Page 28: Seasar Conference 2009 White - DI

Seasar2を使うと…

(参考:さっきのコード)

Page 29: Seasar Conference 2009 White - DI

新しいBusinessLogic

これで、Main, BusinessLogic共にConverter実装が無くてもコンパイルできるようになりました。

Page 30: Seasar Conference 2009 White - DI

何が起きたのか?BusinessLogicをnewする時には、コンストラクタに何らかのConverterを与えなければならない

Seasar2は、BusinessLogicのインスタンスをどのようにして作ったのか…?

(コードから、BLのnewが消えています。)

Page 31: Seasar Conference 2009 White - DI

diconファイル (S2の設定ファイル)

BusinessLogicを "businessLogic"と命名

そのコンストラクタ引数(arg)には、OriginalConverterをあげてくださいね。

classpathルートの app.dicon

Page 32: Seasar Conference 2009 White - DI

DIを使うとどうなるか

コンパイル時に、依存の実装が要らなくなる

実行時(ランタイム)のみ、実装が要る

再コンパイルなしで、XML(dicon)を書き換え

るだけで、プログラムの動作を変えられる

Page 33: Seasar Conference 2009 White - DI

XML書き換え

Page 34: Seasar Conference 2009 White - DI

DB選択のifが消えました

Page 35: Seasar Conference 2009 White - DI

DIコンテナ - S2Container

コンポーネント(=インスタンス)の管理人

くれ(getComponent)といったらくれる

しかも、依存性を解決してくれる

インスタンスのライフサイクル管理

いつ生成され、いつ破棄されるのか

Page 36: Seasar Conference 2009 White - DI

DIの種類コンストラクタ・インジェクション先ほどの例

セッター・インジェクションnew後、setterを介してインジェクション

メソッド・インジェクションnew後、任意のメソッドを実行

フィールド・インジェクションフィールドに直接インジェクション

Page 37: Seasar Conference 2009 White - DI

Section 4ちょっとした応用

Page 38: Seasar Conference 2009 White - DI

実はdiconはコレでもいい(実装が1種類しか無い時限定)

2つのコンポーネント(インスタンス)が登録された状態

これだけで、getComponent("businessLogic") する。

Page 39: Seasar Conference 2009 White - DI

この時、S2の脳内では…BusinessLogicくれって言われた。

でもコンストラクタにConverterが要る。

俺、Converter型のコンポーネント、何か持ってたっけ…?

あ、OracleConverterがあった。

こいつ食わせとくか。

Page 40: Seasar Conference 2009 White - DI

自動インジェクションと、呼ばれている機能です。

もの凄く、空気読んでくれる系。

ただし、自動DIには細かい条件アリ

トラブル

なぜかインジェクションされない

なぜかインジェクションされてしまう

ドキュメント必読

Page 41: Seasar Conference 2009 White - DI

まとめDIは、オブジェクト指向の理論の上にある依存性は小さく & 出来る限り抽象(仕様)に依存

Seasar2は、DIを実現する仕組み主要な型は S2Container依存定義はdiconファイルに記述 (app.dicon)自動インジェクション等の機能もアリ

実はStrategyパターン

Page 42: Seasar Conference 2009 White - DI

以上、ご清聴ありがとうございました。