簡體   English   中英

避免使用面向對象設計的if語句,PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM