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

11,330 views

Published on

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

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,330
On SlideShare
0
From Embeds
0
Number of Embeds
8,834
Actions
Shares
0
Downloads
12
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

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

  1. 1. あのパターンと 仲良く付き合う Mao Nishi twitter:@mao_nishi
  2. 2. Gang of Four 23種類のパターン
  3. 3. その中でも馴染みが深い パターンといえば
  4. 4. Singleton
  5. 5. よくある実装 +(instancetype)sharedInstance { static UserManager *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[UserManager alloc]init]; }); return instance; }
  6. 6. よくある呼び出し [UserManager sharedInstance].userName = @"taro";
  7. 7. よく使われている • [NSUserDefaults standardUserDefaults] • [NSNotificationCenter defaultCenter] • [NSBundle mainBundle] • 他にもいろいろ
  8. 8. 開発当初・・ 参照 Class A Singleton Class
  9. 9. 開発が進んでくると・・ 参照 Class A Singleton Class 参照 Class B 参照 参照 Class C
  10. 10. 依存性するオブジェクトが増えてくる Class A 参照 参照 Singleton Class 参照 参照 参照 Class B Class C Singleton Class
  11. 11. 単体で利用できない オブジェクトが増えてくる
  12. 12. 単体でテストしたいのに
  13. 13. Singleton実装のクラスに テスト用のコード(reset、clear、フラグ制御等) 入れちゃったり
  14. 14. 依存性が高くなることが Singletonパターン のデメリットとして挙げられる
  15. 15. 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
  16. 16. Singletonパターンが悪いわけではな く静的に呼び出していることが問題
  17. 17. Singletonでよく云われるデメリット • オブジェクトに依存関係が発生する • 単体テストで前テスト状態を引き継いでしまう • 再利用、継承できない。sharedInstanceで継承元 のインスタンスが返却される
  18. 18. デメリットは分かった でも必要な場面がある
  19. 19. デメリットを解消するには?
  20. 20. ! 依存性の注入というアプローチ で静的な呼び出しを解消する
  21. 21. 依存性の注入(いそんせいのちゅうにゅう、英: 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
  22. 22. 依存性の注入の概念はXCode でも見受けられる User Defined Runtime Attributes External Object
  23. 23. Singletonに対して注入するIF は見受けられない
  24. 24. Objective-c向けの 依存性の注入フレームワーク
  25. 25. Singletonでよく云われるデメリット • オブジェクトに依存関係が発生する • 単体テストで前テスト状態を引き継いでしまう • 再利用、継承できない。sharedInstanceで継承元 のインスタンスが返却される
  26. 26. block構文で注入可能 (xmlファイルでも可) TyphoonAssembly @implementation MiddleAgesAssembly - (id)userManager { return [TyphoonDefinition withClass: [UserManager class]initialization:^(TyphoonInitializer *initializer) { } properties:^(TyphoonDefinition *definition) { //singletonにしたいとき [definition setScope:TyphoonScopeSingleton]; ! ! 注入処理の実装 } @end [definition injectProperty:@selector(forTintColor) withValueAsText:@"#0a1d3b"]; [definition injectProperty:@selector(conTintColor) withValueAsText:@"#606970"]; }]; }];
  27. 27. 呼び出しは少々冗長 TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssembly:[UserManagerAssembly assembly]]; ! UserManager *userManager = [(UserManagerAssembly*)factory userManager];
  28. 28. Singletonでよく云われるデメリット • オブジェクトに依存関係が発生する • 単体テストで前テスト状態を引き継いでしまう • 再利用、継承できない。sharedInstanceで継承元 のインスタンスが返却される
  29. 29. DIコンテナ経由のアクセスで Singletonも実現できる before after シングルトン実装されていないクラスなのに シングルトンパターンが適用できる Singleton 参照 Class A Class B not Singleton not Singleton 参照 Typhoon(DIコンテナ) Class A Class B
  30. 30. テストメソッド毎に オブジェクトを生成できる 特別な初期化処理が不要になる
  31. 31. Singletonでよく云われるデメリット • オブジェクトに依存関係が発生する • 単体テストで前テスト状態を引き継いでしまう • 再利用、継承できない。sharedInstanceで継承元 のインスタンスが返却される
  32. 32. 継承後の生成処理に余計な処 理を作らなくて済む before Singleton A not Singleton E Singleton B sharedIns tanceA after not Singleton F sharedIns tanceB Class C alloc init Class G alloc init
  33. 33. まとめ • Singletonパターンが悪いのではなく、静的に呼び出 しをしていることが悪い状態を招く • Typhoonを使うことでSingletonの実装を行わなくても Singletonパターンを実現することができる • 単体テストコード中でSingletonに対する処置を書く 必要がなくなる
  34. 34. ! 依存性の注入を利用して Singletonパターンと上手に お付き合いしていきましょう
  35. 35. そして単体テストが楽にできる 環境を作っていきましょう!
  36. 36. ご静聴ありがとうございました
  37. 37. 引用させて頂いた資料 • 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

×