あのパターンと仲良く付き合う 西磨翁 #yxcm

38
あのパターンと 仲良く付き合う Mao Nishi twitter:@mao_nishi

Upload: mao-nishi

Post on 07-Jul-2015

8.776 views

Category:

Technology


1 download

DESCRIPTION

ヤフー vs クラスメソッド「iOS 炎の7番勝負」にて発表 http://connpass.com/event/5159/ http://dev.classmethod.jp/news/yxcm/ #yxcm

TRANSCRIPT

Page 1: あのパターンと仲良く付き合う 西磨翁 #yxcm

あのパターンと 仲良く付き合うMao Nishitwitter:@mao_nishi

Page 2: あのパターンと仲良く付き合う 西磨翁 #yxcm

Gang of Four 23種類のパターン

Page 3: あのパターンと仲良く付き合う 西磨翁 #yxcm

その中でも馴染みが深い パターンといえば

Page 4: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singleton

Page 5: あのパターンと仲良く付き合う 西磨翁 #yxcm

+(instancetype)sharedInstance { static UserManager *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[UserManager alloc]init]; }); return instance; }

よくある実装

Page 6: あのパターンと仲良く付き合う 西磨翁 #yxcm

[UserManager sharedInstance].userName = @"taro";

よくある呼び出し

Page 7: あのパターンと仲良く付き合う 西磨翁 #yxcm

よく使われている

• [NSUserDefaults standardUserDefaults]

• [NSNotificationCenter defaultCenter]

• [NSBundle mainBundle]

• 他にもいろいろ

Page 8: あのパターンと仲良く付き合う 西磨翁 #yxcm

開発当初・・

Class A Singleton Class参照

Page 9: あのパターンと仲良く付き合う 西磨翁 #yxcm

開発が進んでくると・・

Class A

Class B Class C

Singleton Class参照

参照参照 参照

Page 10: あのパターンと仲良く付き合う 西磨翁 #yxcm

依存性するオブジェクトが増えてくる

Class A

Class BClass C

Singleton Class

Singleton Class

参照

参照参照

参照 参照

Page 11: あのパターンと仲良く付き合う 西磨翁 #yxcm

単体で利用できない オブジェクトが増えてくる

Page 12: あのパターンと仲良く付き合う 西磨翁 #yxcm

単体でテストしたいのに

Page 13: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singleton実装のクラスに

テスト用のコード(reset、clear、フラグ制御等) 入れちゃったり

Page 14: あのパターンと仲良く付き合う 西磨翁 #yxcm

依存性が高くなることが Singletonパターン

のデメリットとして挙げられる

Page 15: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singleton パターン(シングルトン・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。 ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならな

い仕組みの実装に使用される。 !

wikipedia参照

http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Page 16: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonパターンが悪いわけではなく静的に呼び出していることが問題

Page 17: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonでよく云われるデメリット

• オブジェクトに依存関係が発生する

• 単体テストで前テスト状態を引き継いでしまう

• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される

Page 18: あのパターンと仲良く付き合う 西磨翁 #yxcm

デメリットは分かった でも必要な場面がある

Page 19: あのパターンと仲良く付き合う 西磨翁 #yxcm

デメリットを解消するには?

Page 20: あのパターンと仲良く付き合う 西磨翁 #yxcm

!

依存性の注入というアプローチ で静的な呼び出しを解消する

Page 21: あのパターンと仲良く付き合う 西磨翁 #yxcm

依存性の注入(いそんせいのちゅうにゅう、英:

Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。

!

wikipedia参照

http://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE

%E6%B3%A8%E5%85%A5

Page 22: あのパターンと仲良く付き合う 西磨翁 #yxcm

依存性の注入の概念はXCodeでも見受けられる

User Defined Runtime Attributes External Object

Page 23: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonに対して注入するIFは見受けられない

Page 24: あのパターンと仲良く付き合う 西磨翁 #yxcm
Page 25: あのパターンと仲良く付き合う 西磨翁 #yxcm

Objective-c向けの 依存性の注入フレームワーク

Page 26: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonでよく云われるデメリット

• オブジェクトに依存関係が発生する

• 単体テストで前テスト状態を引き継いでしまう

• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される

Page 27: あのパターンと仲良く付き合う 西磨翁 #yxcm

block構文で注入可能 (xmlファイルでも可)

TyphoonAssembly

注入処理の実装

@implementation MiddleAgesAssembly - (id)userManager { return [TyphoonDefinition withClass: [UserManager class]initialization:^(TyphoonInitializer *initializer) { } properties:^(TyphoonDefinition *definition) { //singletonにしたいとき [definition setScope:TyphoonScopeSingleton]; !! [definition injectProperty:@selector(forTintColor) withValueAsText:@"#0a1d3b"]; [definition injectProperty:@selector(conTintColor) withValueAsText:@"#606970"]; }]; }]; } @end

Page 28: あのパターンと仲良く付き合う 西磨翁 #yxcm

呼び出しは少々冗長

TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssembly:[UserManagerAssembly assembly]]; ! UserManager *userManager = [(UserManagerAssembly*)factory userManager];

Page 29: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonでよく云われるデメリット

• オブジェクトに依存関係が発生する

• 単体テストで前テスト状態を引き継いでしまう

• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される

Page 30: あのパターンと仲良く付き合う 西磨翁 #yxcm

DIコンテナ経由のアクセスで Singletonも実現できる

Singleton

参照

not Singleton not Singleton

参照

シングルトン実装されていないクラスなのに シングルトンパターンが適用できる

before after

Class A Class B Class A Class B

Typhoon(DIコンテナ)

Page 31: あのパターンと仲良く付き合う 西磨翁 #yxcm

テストメソッド毎に オブジェクトを生成できる

特別な初期化処理が不要になる

Page 32: あのパターンと仲良く付き合う 西磨翁 #yxcm

Singletonでよく云われるデメリット

• オブジェクトに依存関係が発生する

• 単体テストで前テスト状態を引き継いでしまう

• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される

Page 33: あのパターンと仲良く付き合う 西磨翁 #yxcm

継承後の生成処理に余計な処理を作らなくて済む

Singleton A

Class C

sharedInstanceA

Class G

Singleton B

not Singleton E

not Singleton F

sharedInstanceB alloc initalloc init

before after

Page 34: あのパターンと仲良く付き合う 西磨翁 #yxcm

まとめ• Singletonパターンが悪いのではなく、静的に呼び出しをしていることが悪い状態を招く

• Typhoonを使うことでSingletonの実装を行わなくてもSingletonパターンを実現することができる

• 単体テストコード中でSingletonに対する処置を書く必要がなくなる

Page 35: あのパターンと仲良く付き合う 西磨翁 #yxcm

!

依存性の注入を利用して Singletonパターンと上手に お付き合いしていきましょう

Page 36: あのパターンと仲良く付き合う 西磨翁 #yxcm

そして単体テストが楽にできる環境を作っていきましょう!

Page 37: あのパターンと仲良く付き合う 西磨翁 #yxcm

ご静聴ありがとうございました

Page 38: あのパターンと仲良く付き合う 西磨翁 #yxcm

引用させて頂いた資料• http://www.typhoonframework.org/#prettyPhoto

• http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

• http://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5

• http://nikic.github.io/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html

• http://phpmentors.jp/post/58653036033/dont-be-stupid-but-grasp-solid