Re: [請益] Dependency Injection 疑問
你要設計一個方法,要能通過floppy bird的關卡
一種鳥只能飛低、超低、高、超高
假設你寫了一個這樣只能飛高的鳥的class
class FlyHighBird
{
public function fly()
{
return "fly high";
}
}
但是floppy bird的關卡的class中
Class Stage
{
private $bird;
private $interspace;
function __construct()
{
$this->bird = new FlyHighBird();
}
function check()
{
if($this->bird->fly() == $interspace)
return true;
return false;
}
// other method dynamically change $interspace
}
Stage在編譯時期就決定依賴於Bird物件
那麼你這隻只能飛高的鳥,勢必過不了關卡現在空隙位置是
低、超低、或超高的檢查
那麼要能一直通過不同高度的關卡檢查,
你勢必要在runtime改變Stage依賴的物件才行
其實Stage根本不care你是哪種鳥,甚至根本不care你是不是鳥,
他只在乎你是飛的高還是飛的低,也就是只在乎你的
"飛的行為",你手邊有四種鳥都只能飛不同的高度,那麼你只要能動態改變Stage依賴
的$bird物件中的實作,似乎就能通過每一次的檢查
所以你把"飛的行為"從四種鳥的class中一般化成介面
interface FlyBehavior
{
public function fly();
}
四種鳥分別實作這個介面完成四種不同高度的飛行行為
改變Stage相依的物件
class Stage
{
private $flyBehavior;
private $interspace;
function setFlyBehavior($flyBehavior)
{
$this->flyBehavior = $flyBehavior;
}
function check()
{
if($this->flyBehavior->fly() == $interspace)
return true;
return false;
}
//other methods
}
現在Stage 沒有在編譯時期依賴於某一種鳥類了,而是透過FlyBehavior介面
從Stage的外部注入其中一種鳥類的實作,來動態透過setFlyBehavior的替換目前
依賴的實作,這種依賴關係從原本自己物件內部,到被抽到外部決定再透過setter
或建構子注入就是依賴注入,能做到runtime才根據一些參數
(比如說Stage有個方法getInterspace()提供給你$interspace的數值,再在外部加以判斷)
決定要注入哪一種實作,來達到通過每一次檢查的彈性
將來floppy bird改版了,要檢查是否到達"宇宙的高度",才算通過
你只要打造一個火箭的Class,一樣完成FlyBehavior的實作,讓他飛到宇宙的高度
再注入到Stage物件就能通過關卡了,而你"並沒有修改Stage一開始相依物件的程式碼"
因為Stage原本直接依賴於某種鳥類的實作,這樣的關係被"介面"decoupling了
也就是"針對介面寫程式,不要針對實作寫程式"的OO守則
配合DI的方式能做到更多面對需求變更時,還能保有彈性,你要修改的程式少了很多
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.224.178.103
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1433858945.A.BDA.html
※ 編輯: banjmin (125.224.178.103), 06/09/2015 22:12:44
推
06/10 00:56, , 1F
06/10 00:56, 1F
推
06/10 08:46, , 2F
06/10 08:46, 2F
→
06/10 08:46, , 3F
06/10 08:46, 3F
→
06/10 09:14, , 4F
06/10 09:14, 4F
推
06/10 09:23, , 5F
06/10 09:23, 5F
推
06/10 13:15, , 6F
06/10 13:15, 6F
→
06/10 13:16, , 7F
06/10 13:16, 7F
→
06/10 13:16, , 8F
06/10 13:16, 8F
→
06/10 13:17, , 9F
06/10 13:17, 9F
→
06/10 13:18, , 10F
06/10 13:18, 10F
→
06/10 13:20, , 11F
06/10 13:20, 11F
推
06/10 13:40, , 12F
06/10 13:40, 12F
→
06/10 13:41, , 13F
06/10 13:41, 13F
→
06/10 13:42, , 14F
06/10 13:42, 14F
→
06/10 13:43, , 15F
06/10 13:43, 15F
→
06/10 22:50, , 16F
06/10 22:50, 16F
→
06/10 22:50, , 17F
06/10 22:50, 17F
→
06/10 22:51, , 18F
06/10 22:51, 18F
→
06/10 22:51, , 19F
06/10 22:51, 19F
→
06/10 22:53, , 20F
06/10 22:53, 20F
→
06/10 23:02, , 21F
06/10 23:02, 21F
→
06/10 23:02, , 22F
06/10 23:02, 22F
→
06/10 23:03, , 23F
06/10 23:03, 23F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章