在設計一個系統時,低耦合是其中一個目標,當需求出現,對之前已運行很穩定的程式碼變動越少越好,低耦合意味著能夠在這樣的前提之下,也能相對容易得去擴充新功能。
PHP的interface是一個很不錯的低耦合考慮因素。
情況:需要寫一個會員紅利產生判斷
一開始先設好MemberCoin的interface,然後令大家都會用到的function,但是這裡有任何實作,感覺有點像是我來訂一個標準,每個有implements我的都統一用這個function實作吧!
一開始先設好MemberCoin的interface,然後令大家都會用到的function,但是這裡有任何實作,感覺有點像是我來訂一個標準,每個有implements我的都統一用這個function實作吧!
interface MemberCoin
{
public function schedule($who);
}
{
public function schedule($who);
}
接著需要編寫各種活動:
class Sales implements MemberCoin //銷售單
{
public function schedule($who)
{
// do something..
$result = ($who=="Vip")? 300:200;
return $result;
}
}
class Birthday implements MemberCoin //生日
{
public function schedule($who)
{
$result = ($who=="Vip")? 200:100;
return $result;
}
}
{
public function schedule($who)
{
// do something..
$result = ($who=="Vip")? 300:200;
return $result;
}
}
class Birthday implements MemberCoin //生日
{
public function schedule($who)
{
$result = ($who=="Vip")? 200:100;
return $result;
}
}
接著要寫個接口:
class UserController
{
public function __construct(MemberCoin $membercoin)
{
$this->membercoin = $membercoin;
}
public function showResult($who)
{
echo $this->membercoin->schedule($who);
}
}
{
public function __construct(MemberCoin $membercoin)
{
$this->membercoin = $membercoin;
}
public function showResult($who)
{
echo $this->membercoin->schedule($who);
}
}
使用的重點就在紅字粗體的地方,這裡調動的不是任何一個特定的活動,而是我們一開始設定好的interface,所以不管我們之後怎麼變動活動的內容,接口端完全不用任何變動,因為它只負責執行而已。
現在把他實作出來:
// 調用銷貨單class
$class_sales = new Sales;
// 讓接口端知道我們要調用銷貨單class
$class_usercontroller = new UserController($class_sales);
// 接口端用銷貨單class執行結果
echo $class_usercontroller->showResult("Vip");
$class_sales = new Sales;
// 讓接口端知道我們要調用銷貨單class
$class_usercontroller = new UserController($class_sales);
// 接口端用銷貨單class執行結果
echo $class_usercontroller->showResult("Vip");
簡單寫就是:
echo (new UserController(new Sales))->showResult("Vip");
300