[英]Avoiding if-statements with object oriented design, PHP
我基本上是為我創建的廣告系統創建一個顯示模塊。
我試圖避免以下構造,重復if語句。
我的直覺告訴我,有一種更聰明的方法可以做到這一點,也許是多態性?
<?php
class Ad {
public $adState = 'active';
}
class AdWriter {
public function displayAd(Ad $ad, $viewmode = 'visitor') {
if ($viewmode =='visitor') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
else if ($viewmode = 'owner') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
else if ($viewmode == 'administrator') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
}
}
?>
您可以使用viewmode
上的開關創建Factory(Pattern) ,並創建一個特定的Ad
實現一個具有簡單功能'display'的界面 。
偽示例:
class AdFactory {
public static function getAd($sType) {
switch($sType) {
case "AdOne":
return new AdOne();
case "AdTwo":
return new AdTwo();
}
}
throw new Exception("Unknown ad!");
}
class AdOne implement AdInterface {
public function display() {
// All that AdOne does when displaying.
}
}
interface AdInterface {
public function display() { }
}
$oAd1 = AdFactory::getAd('typeOne');
$oAd1->display();
$oAd2 = AdFactory::getAd('typeTwo');
$oAd2->display();
而不是傳遞$ viewmode,傳遞一個對象,該對象將封裝此視圖的邏輯,並調用其方法來完成工作。 這樣您就可以避免使用if語句。
我正在工作中偷偷摸摸StackOverflow,所以沒有時間寫下你所有可能性的詳細回復。
但要“整理”那些ifs,你可以這樣做:
switch $viewmode {
case 'visitor':
your_code_here;
break;
case 'owner':
your_code_here;
break;
default:
will_run_if_nothing_above_matches;
break;
}
switch($viewmode){
case "visitor":
switch($adstate){
case "active":
//statement
break;
case "paused":
break;
case "inactive":
break;
}
break;
case "owner":
break;
case "administrator":
break;
}
在本書的第8章中,您可以找到對您問題的非常詳細的答案。
簡而言之:使用Composition或Factories。 (見Wesley van Opdorp的回答)。
另外,避免使用字符串參數作為枚舉: $viewmode = 'visitor'
使用此參數,您必須將此參數的所有可能值保留在內存中。 或者查看函數代碼來記住它們。 這些價值觀是字符串 - 拼寫錯誤的好地方。 此外,更改要素中的值將非常困難,因為此方法的所有調用都將包含硬編碼字符串。
使用類常量:
class AdWriter {
const view_mode_visitor = 1;
...
另外, $adState
- 錯誤的代碼,應該是$ ad-> state。 但是使用公共領域也是不好的做法:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.