SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
あのパターンと
仲良く付き合う
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

Mais conteúdo relacionado

Destaque

Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Hiramatsu Ryosuke
 
自動テスト入れてみたけど、誰からも反応が無かった話。
自動テスト入れてみたけど、誰からも反応が無かった話。自動テスト入れてみたけど、誰からも反応が無かった話。
自動テスト入れてみたけど、誰からも反応が無かった話。naoyuki miyata
 
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-Yusuke Hosonuma
 
iOS アプリのメンテナンス性を高めるための基本的な考え方
iOS アプリのメンテナンス性を高めるための基本的な考え方iOS アプリのメンテナンス性を高めるための基本的な考え方
iOS アプリのメンテナンス性を高めるための基本的な考え方kakegawa-atsushi
 
Yahoo vs classmethod-introduction
Yahoo vs classmethod-introductionYahoo vs classmethod-introduction
Yahoo vs classmethod-introductionRikitake Oohashi
 
AWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAmazon Web Services Japan
 
事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のりRecruit Lifestyle Co., Ltd.
 

Destaque (7)

Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm
 
自動テスト入れてみたけど、誰からも反応が無かった話。
自動テスト入れてみたけど、誰からも反応が無かった話。自動テスト入れてみたけど、誰からも反応が無かった話。
自動テスト入れてみたけど、誰からも反応が無かった話。
 
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
 
iOS アプリのメンテナンス性を高めるための基本的な考え方
iOS アプリのメンテナンス性を高めるための基本的な考え方iOS アプリのメンテナンス性を高めるための基本的な考え方
iOS アプリのメンテナンス性を高めるための基本的な考え方
 
Yahoo vs classmethod-introduction
Yahoo vs classmethod-introductionYahoo vs classmethod-introduction
Yahoo vs classmethod-introduction
 
AWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoT
 
事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり
 

Último

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Último (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

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