Dependency Injection
FAQ
かねうちてつや
Cocoa勉強会関西
2013.08.03
自己紹介
かねうちてつや
@kaniza, id:kaniza, facebook.com/kaniza など
特に蟹が好きなわけではない
オブジェクト指向好き
Emacs 好き
ビール好き
前回までのあらすじ
2013.06.01 第50回Cocoa勉強会関西
「ワタシは Singleton がキライだ」
かなりスッキリできました
ブログも書きました
おさらい
前回の質疑応答
サブクラスって作らないといけないの?
必要なオブジェクトはコンテナから取得す
る?
サブクラス必要?
TyphoonAssembly でInject するためのイニシャラ
イザを実装できれば、サブクラスではなく
カテゴリによる追加でも可
オブジェクトはコンテナから取得?
しない
Singletonの置き換え
- (void)doSomething
{
FooManager *manager = [FooManager sharedInstance];
[manager manageSomething];
}
Singletonの置き換え
- (void)doSomething
{
TyphoonComponentFactory *factory =
[TyphoonComponentFactory defaultFactory];
FooManager *manager =
[factory componentOfType:[FooManager class]];
[manager manageSomething];
}
Singletonの置き換え
- (id)initWithFooManager:(FooManager *)fooManager
{
... self.fooManager = fooManager; ...
}
- (void)doSomething
{
[self.fooManager manageSomething];
}
生成に必要なヤツ
- (void)addNewBar
{
FooManager *manager = [FooManager sharedInstance];
Bar *bar = [[Bar alloc] initWithManager:manager
name:@”buzz”];
[self.bars addObject:bar];
}
生成に必要なヤツ
- (id)initWithFooManager:(FooManager *)fooManager {
... self.fooManager = fooManager; ...
}
- (void)addNewBar {
Bar *bar = [[Bar alloc] initWithManager:self.fooManager
name:@”buzz”];
[self.bars addObject:bar];
}
よくない理由
MyClass Bar
FooManager
⃝
AbstractFactory
- (id)initWithBarFactory:(BarFactory *)factory {
... self.barFactory = factory; ...
}
- (void)addNewBar
{
Bar *bar = [self.barFactory barWithName:@”buzz”];
[self.bars addNewBar:bar];
}
AbstractFactory
@implementation BarFactory
- (id)initWithFooManager:(FooManager *)fooManager {
... self.fooManager = fooManager; ...
}
- (Bar *)barWithName:(NSString *)name
{
return [[Bar alloc] initWithManager:self.fooManager
name:name];
}
AbstractFactory
@interface MyClass
- (void)addNewBar;
@end
@implementation
- (id)initWithBarFactory:(BarFactory *)factory {...}
...
@end
AbstractFactory
@interface BarFactory
- (Bar *)barWithName:(NSString *)name;
@end
@implementation
- (id)initWithFooManager:
(FooManager *)fooManager {...}
...
@end
妥当な依存関係
MyClass Bar
BarFactory
⃝
⃝
FooManager
⃝
依存にもいろいろ
どのレベル”が”依存するか
△ インタフェース(影響大)
⃝ 実装(影響小)
どのレベル”に”依存するか
⃝ インタフェース(変わりにくい)
△ 実装(変わりやすい)
まとめ
Dependency Injection こわくないよ
依存関係がキレイになると暮らしがよくな
るよ

Dependency Injection FAQ