Enviar búsqueda
Cargar
ワタシはSingletonがキライだ
•
33 recomendaciones
•
18,093 vistas
Tetsuya Kaneuchi
Seguir
第50回Cocoa勉強会関西の発表資料です。
Leer menos
Leer más
Denunciar
Compartir
Denunciar
Compartir
1 de 38
Recomendados
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
例外設計における大罪
例外設計における大罪
Takuto Wada
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
UniTask入門
UniTask入門
torisoup
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
Recomendados
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
例外設計における大罪
例外設計における大罪
Takuto Wada
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
UniTask入門
UniTask入門
torisoup
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
UniRx完全に理解した
UniRx完全に理解した
torisoup
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
DeNA
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
Assembly Definition あれやこれ
Assembly Definition あれやこれ
NakanoYosuke1
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
Mikito Yoshiya
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
[Android]Static変数さんとactivityさん
[Android]Static変数さんとactivityさん
Hirokazu Fukami
Android Hacks - 合宿 Activity
Android Hacks - 合宿 Activity
Masanori Ohkawara
Más contenido relacionado
La actualidad más candente
UniRx完全に理解した
UniRx完全に理解した
torisoup
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
DeNA
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
Assembly Definition あれやこれ
Assembly Definition あれやこれ
NakanoYosuke1
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
Mikito Yoshiya
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
La actualidad más candente
(20)
UniRx完全に理解した
UniRx完全に理解した
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
オブジェクト指向できていますか?
オブジェクト指向できていますか?
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
C#で速度を極めるいろは
C#で速度を極めるいろは
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
Assembly Definition あれやこれ
Assembly Definition あれやこれ
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
DockerとPodmanの比較
DockerとPodmanの比較
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Destacado
[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
Destacado
(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
証明プログラミング超入門
証明プログラミング超入門
Más de 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
Más de 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コ ンテナを使えば美しく実現できる 疎結合でテストしやすいコードバンザイ