• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
あのパターンと仲良く付き合う 西磨翁 #yxcm
 

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

on

  • 7,256 views

ヤフー vs クラスメソッド「iOS 炎の7番勝負」にて発表

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

Statistics

Views

Total Views
7,256
Views on SlideShare
1,446
Embed Views
5,810

Actions

Likes
9
Downloads
5
Comments
0

10 Embeds 5,810

http://techblog.yahoo.co.jp 3709
http://keeetaka.hateblo.jp 1258
http://gihyo.jp 484
http://acaric-valuator.blog.jp 203
http://cptl.corp.yahoo.co.jp 96
http://mt01-cms.corp.yahoo.co.jp 31
https://twitter.com 24
http://mym.corp.yahoo.co.jp 3
http://49.212.34.189 1
http://www.google.co.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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