Re: [请益] Dependency Injection 疑问

楼主: eight0 (欸XD)   2015-06-11 09:03:18
Dependency Injection,指的是让 Dependency 能在 runtime 改变,
而不影响 client 本身的实作。
而这个例子,Animal 跟 Bird 本身就没有依赖关系,没有
Dependency,自然没有 DI 的感觉。
若以电脑和影印机、萤幕来举例,电脑需要用输出装置才能输出讯息︰
class Computer
{
public $output;
public function use($something) {
$this->output = $something;
}
public function say_hi() {
$this->output("Hi I am computer!");
}
}
function printer($src_string) {
// print $src_string to printer...
}
function screen($src_string) {
// put $src_string on screen...
}
那么在使用时就可以很随易的使用不同装置︰
$computer = new Computer
$computer->use(printer);
$computer->say_hi();
$computer->use(screen);
$computer->say_hi();
今天突然改版,不用打印机也不用萤幕,改用沙画。
那你只要建立一个沙画的 service,要用时 inject 进 computer 就行了︰
function draw_on_sand($src_string) {
// draw string on sand...
}
$computer->use(draw_on_sand);
$computer->say_hi();
又或者你只是要 debug,想把电脑的输出印到自己的萤幕上︰
funcion print($src_string) {
echo $src_string;
}
$computer->use(print);
$computer->say_hi();
到这边应该看得出来,Dependency Injection 的好处就是,Client 完全
不用知道 $this->output 是什么玩意,只要把字串送给它就好。
引述前一篇 banjmin
> 关系被"接口"decoupling了
> 也就是"针对接口写程式,不要针对实作写程式"的OO守则
作者: et282523 (不屈斗志)   2015-06-11 09:56:00
推,感觉很清楚!
作者: chan15 (ChaN)   2015-06-11 15:20:00
我的问题好像表达不是很清楚,我的问题是差异在哪你上述的方法我一样可以转成 abstract像我的 sample code 说的 (new Game(new Mario))->play()变成 (new Mario)->play() 这样而已结果是完全一样的,这个设计准则不太可能只是语意而已吧
楼主: eight0 (欸XD)   2015-06-11 23:10:00
如我前面所说,这个例子不是依赖的 Service/Client 关系Mario 就是 Game 的 subclass。若设计成 DI 的话,就可以在程式执行时置换新的游戏引擎,如$game = new Game; $game->select(mario); $game->play();要存盘换 race 就像$game->save(); $game->select(race); $game->play();而 subclass 的方式称为 template method,它一样可以把共通的实作抽到上层,但使用上就不像 DI 自由,如不能在执行时抽换、依赖 parent class 等等。

Links booklink

Contact Us: admin [ a t ] ucptt.com