SlideShare a Scribd company logo
1 of 38
Download to read 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

More Related Content

Viewers also liked

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.
 

Viewers also liked (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
 
事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり
 

Recently uploaded

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (10)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

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