SlideShare una empresa de Scribd logo
1 de 38
ワタシは
Singletonがキライだ
かねうちてつや / @kaniza
2013.6.1 第50回 Cocoa勉強会関西
自己紹介
かねうちてつや @kaniza id:kaniza
Cocoa勉強会関西2代目代表(2012年まで)
元Java屋さん(5年くらい前)
Singleton おさらい
GoF デザインパターンの1つ
オブジェクトの単一性を保証する
頻繁に利用される
[HogeManager sharedInstance] とか
よくある光景
エンジニア仲間とビールを飲む
さらに飲む
Singleton を dis りはじめる
まわりが困る
なぜ困るのか
問題意識が共有できない
解決策が見えない
ろれつが回っていない
今日のゴール
ろれつが回らなくなる前に
問題意識を共有して解決策を提案する
前提となる価値観
単体テストしたい
でもできてない
グローバル変数は悪
≒ 密結合は悪
よい設計
疎結合
高凝集
適切な名前
変更時の影響範囲が予測可能かつ最小限
Big Ball of Mud
最も人気のあるソフトウェアアーキテクチ
ャは Big Ball of Mud(大きな泥だんご)である
設計のイメージ
MainViewController
SongStore
SongManager
DetailViewController
ArtworkGenerator
結合度: 低
現実の実装
MainViewController
SongStore
SongManager
DetailViewController
ArtworkGenerator
結合度: 高
Big Ball of Mud
Singletonの誘惑
設計上、離れた場所にある”コンポーネン
ト”への参照が欲しくなったとき
Managed Object Context とか
HogeManager とか
クラスメソッドならどこからでも見える
典型的な実装
+ (id)sharedInstance
{
static HogeManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
このクラスメソッドでのみアクセスさせる
これってグローバル変数
単体テスト
クラスごと、メソッドごとにテストコード
を書いて自動化する
それにはオブジェクトが「単体」で動く必
要がある
ファイルシステムやネットワークは邪魔
static 結合はテストの敵
MyClass
FileManager
ConnectionManager
static
static
テストコードからはファイルや
ネットワークアクセスを防げない
Test Code
dynamic 結合なら何とかなる
MyClass
MockFileManager
MockConnManager
dynamic
dynamic
テストコードからモック
オブジェクトに差し替え可能
Test Code
Singleton と static 結合
Singleton は static な結合を招く
インスタンスの数は問題ではない
アクセス方法を static に規定するのが悪
static 結合はテスト不能なクラスへの道
Singleton は単体テストの敵
キライになってきた?
解決策
DI: Dependency Injection
依存性注入
オブジェクトが依存先を解決しない
必要なものは与えられる。取りに行くな
取りに行くときにSingletonの誘惑が....
DI コンテナ
専用のコンテナオブジェクトにコンポーネ
ントの情報を登録
コンポーネントの依存関係を解決して生成
コンポーネントインスタンスの数も管理
(普通は1個でいいはず)
原則、コンポーネントの alloc init は不要に
DIコンテナの依存性解決
A
B
C
Cが必要になったらA, B, Cの順に生成してくれる
依存
依存
依存
オブジェクト生成は大仕事
あるオブジェクトを生成するのに必要なオ
ブジェクトを えるのはけっこう大変
他のオブジェクトを生成するためだけに依
存関係が発生してしまうことも
大変なのでコンテナに任せてしまおう
Cocoa 向け DI コンテナ
Typhoon Framework
Typhoon Framework
元 Java 屋に親しみやすいデザイン
コンポーネント情報を Block で書ける
コンポーネント側をほぼいじらないっぽい
TyphoonAssembly のサブクラスにコンポーネン
ト情報を記述、TyphoonFactoryから取得
Cocoa Singleton あるある
NSManagedObjectContext
AppDelegate から取得?
NSBundle
mainBundle
CoreDataBooks on
Typhoon
CoreDataBooks on Typhoon
Apple のサンプルコードを Typhoon ベースに変
換
AppDelegate の Core Data Stack コードを一掃
コンポーネントは他のコンポーネントへの
参照を注入される
サブクラス化して細かいパラメータ初期化
DIの気持ち悪さ
別名 IoC (Inversion of Control: 制御の反転)
取りに行くのではなく与えられる
自分でやってた部分を他人に任せる
中身がよく見えなくなる
IoC はオブジェクト指向の基本
フロー型からイベントドリブンへの流れは
まさに「制御の反転」
viewDidLoad とか
applicationDidFinishLaunching:とか
だんだん気持ち良くなる
DI コンテナの誤解
コンポーネントを取得するためにコンテナ
へのアクセスが多発する
コンテナへのアクセスはごく一部。基本
的に注入されたコンポーネントを使う
生成が必要ならファクトリオブジェクト
をコンポーネントとして注入する
DI コンテナの誤解
テストコードでもコンテナを使う
ふつう使わない。テストコードから直接
モックオブジェクトなどを注入する
initializer が長くなる
本当かも。でも自分で呼ばないし!
まとめ
Singleton は現代のグローバル変数。結合度が
高くテストしにくいコードを招く
SingletonでやりたいことはTyphoon などの DIコ
ンテナを使えば美しく実現できる
疎結合でテストしやすいコードバンザイ

Más contenido relacionado

La actualidad más candente

UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解したtorisoup
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化DeNA
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Masahito Zembutsu
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 
Assembly Definition あれやこれ
Assembly Definition あれやこれAssembly Definition あれやこれ
Assembly Definition あれやこれNakanoYosuke1
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること信之 岩永
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜Mikito Yoshiya
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 

La actualidad más candente (20)

UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Assembly Definition あれやこれ
Assembly Definition あれやこれAssembly Definition あれやこれ
Assembly Definition あれやこれ
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 

Destacado

[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさんHirokazu Fukami
 
Android Hacks - 合宿 Activity
Android Hacks - 合宿 ActivityAndroid Hacks - 合宿 Activity
Android Hacks - 合宿 ActivityMasanori Ohkawara
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)についてYui Ito
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingTricode (part of Dept)
 
Iteratorパターン
IteratorパターンIteratorパターン
Iteratorパターンnekop
 
Java Drag Race Tuning
Java Drag Race TuningJava Drag Race Tuning
Java Drag Race Tuningnekop
 
Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎Hiroyuki Ohnaka
 
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)tomonari takahashi
 
GCについて
GCについてGCについて
GCについてcactusman
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介Masahiro Sakai
 
AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化Toshio Ehara
 
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションAngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションYosuke Onoue
 
型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへ型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへYusuke Matsushita
 
Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11Hiroshi Hashimoto
 
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月VirtualTech Japan Inc.
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talksMasahiro Nagano
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門Kyoko Kadowaki
 

Destacado (20)

[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん
 
Android Hacks - 合宿 Activity
Android Hacks - 合宿 ActivityAndroid Hacks - 合宿 Activity
Android Hacks - 合宿 Activity
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
Spring4Dの紹介
Spring4Dの紹介Spring4Dの紹介
Spring4Dの紹介
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
 
Iteratorパターン
IteratorパターンIteratorパターン
Iteratorパターン
 
Java Drag Race Tuning
Java Drag Race TuningJava Drag Race Tuning
Java Drag Race Tuning
 
Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎
 
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
 
GCについて
GCについてGCについて
GCについて
 
Di入門
Di入門Di入門
Di入門
 
GCが止まらない
GCが止まらないGCが止まらない
GCが止まらない
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化
 
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションAngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
 
型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへ型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへ
 
Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11
 
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talks
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
 

Más de Tetsuya Kaneuchi

いま OS X アプリがアツい
いま OS X アプリがアツいいま OS X アプリがアツい
いま OS X アプリがアツいTetsuya Kaneuchi
 
Core Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStoreCore Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStoreTetsuya Kaneuchi
 
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話WebViewでエラーページを表示する話
WebViewでエラーページを表示する話Tetsuya Kaneuchi
 

Más de Tetsuya Kaneuchi (7)

いま OS X アプリがアツい
いま OS X アプリがアツいいま OS X アプリがアツい
いま OS X アプリがアツい
 
いまさら NSArray
いまさら NSArrayいまさら NSArray
いまさら NSArray
 
Dependency Injection FAQ
Dependency Injection FAQDependency Injection FAQ
Dependency Injection FAQ
 
Core Animation と View
Core Animation と ViewCore Animation と View
Core Animation と View
 
Core Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStoreCore Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStore
 
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話WebViewでエラーページを表示する話
WebViewでエラーページを表示する話
 
MVCもやもや話
MVCもやもや話MVCもやもや話
MVCもやもや話
 

ワタシはSingletonがキライだ