Submit Search
Upload
ワタシはSingletonがキライだ
•
33 likes
•
18,103 views
Tetsuya Kaneuchi
Follow
第50回Cocoa勉強会関西の発表資料です。
Read less
Read more
Report
Share
Report
Share
1 of 38
Recommended
例外設計における大罪
例外設計における大罪
Takuto Wada
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
こわくない Git
こわくない Git
Kota Saito
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
Observableで非同期処理
Observableで非同期処理
torisoup
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
Recommended
例外設計における大罪
例外設計における大罪
Takuto Wada
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
こわくない Git
こわくない Git
Kota Saito
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
Observableで非同期処理
Observableで非同期処理
torisoup
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
JIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだ
Narichika Kajihara
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
SEGADevTech
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
SEGADevTech
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん
Hirokazu Fukami
Android Hacks - 合宿 Activity
Android Hacks - 合宿 Activity
Masanori Ohkawara
More Related Content
What's hot
JIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだ
Narichika Kajihara
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
SEGADevTech
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
SEGADevTech
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
What's hot
(20)
JIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだ
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Oss貢献超入門
Oss貢献超入門
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
オブジェクト指向できていますか?
オブジェクト指向できていますか?
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
Viewers also liked
[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん
Hirokazu Fukami
Android Hacks - 合宿 Activity
Android Hacks - 合宿 Activity
Masanori Ohkawara
DI(依存性注入)について
DI(依存性注入)について
Yui Ito
Spring4Dの紹介
Spring4Dの紹介
Shinya Okano
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
Tricode (part of Dept)
Iteratorパターン
Iteratorパターン
nekop
Java Drag Race Tuning
Java Drag Race Tuning
nekop
Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎
Hiroyuki Ohnaka
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
tomonari takahashi
GCについて
GCについて
cactusman
Di入門
Di入門
Ryo Asai
GCが止まらない
GCが止まらない
Narihiro Nakamura
自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化
Toshio Ehara
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
Yosuke Onoue
型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへ
Yusuke Matsushita
Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11
Hiroshi Hashimoto
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
VirtualTech Japan Inc.
Isucon makers casual talks
Isucon makers casual talks
Masahiro Nagano
証明プログラミング超入門
証明プログラミング超入門
Kyoko Kadowaki
Viewers also liked
(20)
[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん
Android Hacks - 合宿 Activity
Android Hacks - 合宿 Activity
DI(依存性注入)について
DI(依存性注入)について
Spring4Dの紹介
Spring4Dの紹介
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
Iteratorパターン
Iteratorパターン
Java Drag Race Tuning
Java Drag Race Tuning
Javaパフォーマンスチューニング基礎
Javaパフォーマンスチューニング基礎
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
AngularJS勉強会「そもそもwebって」@ツクロア勉強会(2015.09.10)
GCについて
GCについて
Di入門
Di入門
GCが止まらない
GCが止まらない
自動定理証明の紹介
自動定理証明の紹介
AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
型理論 なんて自分には関係ないと思っているあなたへ
型理論 なんて自分には関係ないと思っているあなたへ
Androidにおけるテストに関して 2014/11
Androidにおけるテストに関して 2014/11
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
Isucon makers casual talks
Isucon makers casual talks
証明プログラミング超入門
証明プログラミング超入門
More from Tetsuya Kaneuchi
いま OS X アプリがアツい
いま OS X アプリがアツい
Tetsuya Kaneuchi
いまさら NSArray
いまさら NSArray
Tetsuya Kaneuchi
Dependency Injection FAQ
Dependency Injection FAQ
Tetsuya Kaneuchi
Core Animation と View
Core Animation と View
Tetsuya Kaneuchi
Core Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStore
Tetsuya Kaneuchi
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話
Tetsuya Kaneuchi
MVCもやもや話
MVCもやもや話
Tetsuya Kaneuchi
More from Tetsuya Kaneuchi
(7)
いま OS X アプリがアツい
いま OS X アプリがアツい
いまさら NSArray
いまさら NSArray
Dependency Injection FAQ
Dependency Injection FAQ
Core Animation と View
Core Animation と View
Core Data の概要と NSIncrementalStore
Core Data の概要と NSIncrementalStore
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話
MVCもやもや話
MVCもやもや話
ワタシはSingletonがキライだ
1.
ワタシは Singletonがキライだ かねうちてつや / @kaniza 2013.6.1
第50回 Cocoa勉強会関西
2.
自己紹介 かねうちてつや @kaniza id:kaniza Cocoa勉強会関西2代目代表(2012年まで) 元Java屋さん(5年くらい前)
3.
Singleton おさらい GoF デザインパターンの1つ オブジェクトの単一性を保証する 頻繁に利用される [HogeManager
sharedInstance] とか
4.
よくある光景 エンジニア仲間とビールを飲む さらに飲む Singleton を dis
りはじめる まわりが困る
5.
なぜ困るのか 問題意識が共有できない 解決策が見えない ろれつが回っていない
6.
今日のゴール ろれつが回らなくなる前に 問題意識を共有して解決策を提案する
7.
前提となる価値観 単体テストしたい でもできてない グローバル変数は悪 ≒ 密結合は悪
8.
よい設計 疎結合 高凝集 適切な名前 変更時の影響範囲が予測可能かつ最小限
9.
Big Ball of
Mud 最も人気のあるソフトウェアアーキテクチ ャは Big Ball of Mud(大きな泥だんご)である
10.
設計のイメージ MainViewController SongStore SongManager DetailViewController ArtworkGenerator 結合度: 低
11.
現実の実装 MainViewController SongStore SongManager DetailViewController ArtworkGenerator 結合度: 高 Big Ball
of Mud
12.
Singletonの誘惑 設計上、離れた場所にある”コンポーネン ト”への参照が欲しくなったとき Managed Object Context
とか HogeManager とか クラスメソッドならどこからでも見える
13.
典型的な実装 + (id)sharedInstance { static HogeManager
*instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } このクラスメソッドでのみアクセスさせる
14.
これってグローバル変数
15.
単体テスト クラスごと、メソッドごとにテストコード を書いて自動化する それにはオブジェクトが「単体」で動く必 要がある ファイルシステムやネットワークは邪魔
16.
static 結合はテストの敵 MyClass FileManager ConnectionManager static static テストコードからはファイルや ネットワークアクセスを防げない Test Code
17.
dynamic 結合なら何とかなる MyClass MockFileManager MockConnManager dynamic dynamic テストコードからモック オブジェクトに差し替え可能 Test Code
18.
Singleton と static
結合 Singleton は static な結合を招く インスタンスの数は問題ではない アクセス方法を static に規定するのが悪 static 結合はテスト不能なクラスへの道
19.
Singleton は単体テストの敵
20.
キライになってきた?
21.
解決策
22.
DI: Dependency Injection 依存性注入 オブジェクトが依存先を解決しない 必要なものは与えられる。取りに行くな 取りに行くときにSingletonの誘惑が....
23.
DI コンテナ 専用のコンテナオブジェクトにコンポーネ ントの情報を登録 コンポーネントの依存関係を解決して生成 コンポーネントインスタンスの数も管理 (普通は1個でいいはず) 原則、コンポーネントの alloc
init は不要に
24.
DIコンテナの依存性解決 A B C Cが必要になったらA, B, Cの順に生成してくれる 依存 依存 依存
25.
オブジェクト生成は大仕事 あるオブジェクトを生成するのに必要なオ ブジェクトを えるのはけっこう大変 他のオブジェクトを生成するためだけに依 存関係が発生してしまうことも 大変なのでコンテナに任せてしまおう
26.
Cocoa 向け DI
コンテナ
27.
Typhoon Framework
28.
29.
30.
Typhoon Framework 元 Java
屋に親しみやすいデザイン コンポーネント情報を Block で書ける コンポーネント側をほぼいじらないっぽい TyphoonAssembly のサブクラスにコンポーネン ト情報を記述、TyphoonFactoryから取得
31.
Cocoa Singleton あるある NSManagedObjectContext AppDelegate
から取得? NSBundle mainBundle
32.
CoreDataBooks on Typhoon
33.
CoreDataBooks on Typhoon Apple
のサンプルコードを Typhoon ベースに変 換 AppDelegate の Core Data Stack コードを一掃 コンポーネントは他のコンポーネントへの 参照を注入される サブクラス化して細かいパラメータ初期化
34.
DIの気持ち悪さ 別名 IoC (Inversion
of Control: 制御の反転) 取りに行くのではなく与えられる 自分でやってた部分を他人に任せる 中身がよく見えなくなる
35.
IoC はオブジェクト指向の基本 フロー型からイベントドリブンへの流れは まさに「制御の反転」 viewDidLoad とか applicationDidFinishLaunching:とか だんだん気持ち良くなる
36.
DI コンテナの誤解 コンポーネントを取得するためにコンテナ へのアクセスが多発する コンテナへのアクセスはごく一部。基本 的に注入されたコンポーネントを使う 生成が必要ならファクトリオブジェクト をコンポーネントとして注入する
37.
DI コンテナの誤解 テストコードでもコンテナを使う ふつう使わない。テストコードから直接 モックオブジェクトなどを注入する initializer が長くなる 本当かも。でも自分で呼ばないし!
38.
まとめ Singleton は現代のグローバル変数。結合度が 高くテストしにくいコードを招く SingletonでやりたいことはTyphoon などの
DIコ ンテナを使えば美しく実現できる 疎結合でテストしやすいコードバンザイ