2011-06-16 14 views
7

Básicamente estoy creando un módulo de visualización para un sistema publicitario que he creado.Evitar declaraciones if con diseño orientado a objetos, PHP

Estoy tratando de evitar la siguiente construcción, con declaraciones if repetidas.

Mi intuición me dice que hay una manera más inteligente de hacer esto, ¿quizás con polimorfismo?

<?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') {} 
     } 
    } 
} 

?> 

Respuesta

0

Estoy escabulléndome a StackOverflow en el trabajo, así que no tengo tiempo para escribir una respuesta detallada de todas sus posibilidades.

Pero a 'poner en orden de esos IFS, usted puede hacer esto:

switch $viewmode { 
    case 'visitor': 
    your_code_here; 
    break; 
    case 'owner': 
    your_code_here; 
    break; 
    default: 
    will_run_if_nothing_above_matches; 
    break; 
} 
+2

Preguntó de una manera más inteligente, y usted lo mostró. Bueno. :) –

+2

¿Eso realmente no eliminó nada sin embargo? Todavía estoy atascado con la comprobación de los estados en varias ocasiones. – Poyan

+0

-1 esto es efectivamente lo mismo que el ifs – Gordon

4

puede crear una Factory (Pattern), usando un interruptor de encendido viewmode y crear una específica Ad la implementación de un interface que tiene una función simple 'pantalla ' por ejemplo.

Pseudo ejemplo:

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(); 
+0

Lo investigaré; Gracias. – Poyan

3

en lugar de pasar $ ViewMode, pasar un objeto que encapsula la lógica de este viewmore y llamar a su método que haga el trabajo. De esta manera evitará la necesidad de declaraciones if.

0
switch($viewmode){ 
    case "visitor": 
     switch($adstate){ 
      case "active": 
       //statement 
       break; 
      case "paused": 
      break; 
      case "inactive": 
      break; 
     } 
     break; 
    case "owner": 
     break; 
    case "administrator": 
     break; 
} 
0

En el capítulo 8 de this book puede encontrar una respuesta muy detallada a su pregunta.

En resumen: use Composition o fábricas. (ver respuesta de Wesley van Opdorp).

También, evitar el uso de argumentos de cadena como enumerables: $viewmode = 'visitor'
con este argumento, se tendrá que mantener en la memoria todos los valores posibles de este argumento. O busque en el código de función para recordarlos. Y estos valores son cadenas - buen lugar para errores tipográficos. Además, será muy difícil cambiar los valores en la característica, ya que todas las llamadas de este método contendrán cadenas codificadas.
uso de clase constantes:

class AdWriter { 
const view_mode_visitor = 1; 
... 

Además, $adState - código incorrecto, debe ser $ ad-> Estado. Pero usar campos públicos es una mala práctica también :)

Cuestiones relacionadas