あのパターンと仲良く付き合う 西磨翁 #yxcm
DESCRIPTION
ヤフー vs クラスメソッド「iOS 炎の7番勝負」にて発表 http://connpass.com/event/5159/ http://dev.classmethod.jp/news/yxcm/ #yxcmTRANSCRIPT
![Page 1: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/1.jpg)
あのパターンと 仲良く付き合うMao Nishitwitter:@mao_nishi
![Page 2: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/2.jpg)
Gang of Four 23種類のパターン
![Page 3: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/3.jpg)
その中でも馴染みが深い パターンといえば
![Page 4: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/4.jpg)
Singleton
![Page 5: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/5.jpg)
+(instancetype)sharedInstance { static UserManager *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[UserManager alloc]init]; }); return instance; }
よくある実装
![Page 6: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/6.jpg)
[UserManager sharedInstance].userName = @"taro";
よくある呼び出し
![Page 7: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/7.jpg)
よく使われている
• [NSUserDefaults standardUserDefaults]
• [NSNotificationCenter defaultCenter]
• [NSBundle mainBundle]
• 他にもいろいろ
![Page 8: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/8.jpg)
開発当初・・
Class A Singleton Class参照
![Page 9: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/9.jpg)
開発が進んでくると・・
Class A
Class B Class C
Singleton Class参照
参照参照 参照
![Page 10: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/10.jpg)
依存性するオブジェクトが増えてくる
Class A
Class BClass C
Singleton Class
Singleton Class
参照
参照参照
参照 参照
![Page 11: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/11.jpg)
単体で利用できない オブジェクトが増えてくる
![Page 12: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/12.jpg)
単体でテストしたいのに
![Page 13: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/13.jpg)
Singleton実装のクラスに
テスト用のコード(reset、clear、フラグ制御等) 入れちゃったり
![Page 14: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/14.jpg)
依存性が高くなることが Singletonパターン
のデメリットとして挙げられる
![Page 15: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/16.jpg)
Singletonパターンが悪いわけではなく静的に呼び出していることが問題
![Page 17: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/17.jpg)
Singletonでよく云われるデメリット
• オブジェクトに依存関係が発生する
• 単体テストで前テスト状態を引き継いでしまう
• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される
![Page 18: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/18.jpg)
デメリットは分かった でも必要な場面がある
![Page 19: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/19.jpg)
デメリットを解消するには?
![Page 20: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/20.jpg)
!
依存性の注入というアプローチ で静的な呼び出しを解消する
![Page 21: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/21.jpg)
依存性の注入(いそんせいのちゅうにゅう、英:
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](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/22.jpg)
依存性の注入の概念はXCodeでも見受けられる
User Defined Runtime Attributes External Object
![Page 23: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/23.jpg)
Singletonに対して注入するIFは見受けられない
![Page 24: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/24.jpg)
![Page 25: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/25.jpg)
Objective-c向けの 依存性の注入フレームワーク
![Page 26: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/26.jpg)
Singletonでよく云われるデメリット
• オブジェクトに依存関係が発生する
• 単体テストで前テスト状態を引き継いでしまう
• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される
![Page 27: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/28.jpg)
呼び出しは少々冗長
TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssembly:[UserManagerAssembly assembly]]; ! UserManager *userManager = [(UserManagerAssembly*)factory userManager];
![Page 29: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/29.jpg)
Singletonでよく云われるデメリット
• オブジェクトに依存関係が発生する
• 単体テストで前テスト状態を引き継いでしまう
• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される
![Page 30: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/30.jpg)
DIコンテナ経由のアクセスで Singletonも実現できる
Singleton
参照
not Singleton not Singleton
参照
シングルトン実装されていないクラスなのに シングルトンパターンが適用できる
before after
Class A Class B Class A Class B
Typhoon(DIコンテナ)
![Page 31: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/31.jpg)
テストメソッド毎に オブジェクトを生成できる
特別な初期化処理が不要になる
![Page 32: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/32.jpg)
Singletonでよく云われるデメリット
• オブジェクトに依存関係が発生する
• 単体テストで前テスト状態を引き継いでしまう
• 再利用、継承できない。sharedInstanceで継承元のインスタンスが返却される
![Page 33: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/33.jpg)
継承後の生成処理に余計な処理を作らなくて済む
Singleton A
Class C
sharedInstanceA
Class G
Singleton B
not Singleton E
not Singleton F
sharedInstanceB alloc initalloc init
before after
![Page 34: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/34.jpg)
まとめ• Singletonパターンが悪いのではなく、静的に呼び出しをしていることが悪い状態を招く
• Typhoonを使うことでSingletonの実装を行わなくてもSingletonパターンを実現することができる
• 単体テストコード中でSingletonに対する処置を書く必要がなくなる
![Page 35: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/35.jpg)
!
依存性の注入を利用して Singletonパターンと上手に お付き合いしていきましょう
![Page 36: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/36.jpg)
そして単体テストが楽にできる環境を作っていきましょう!
![Page 37: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/37.jpg)
ご静聴ありがとうございました
![Page 38: あのパターンと仲良く付き合う 西磨翁 #yxcm](https://reader034.vdocuments.site/reader034/viewer/2022042512/559b66531a28ab263c8b4730/html5/thumbnails/38.jpg)
引用させて頂いた資料• 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