Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

12,328 views

Published on

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

Published in: Technology
  • Be the first to comment

あのパターンと仲良く付き合う 西磨翁 #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

×