2010-05-11 6 views
1

Y a-t-il une bonne alternative pour les instructions if en PHP? Je sais environ switch, mais je suppose qu'il existe une alternative plus raffinée là-bas qui est très pratique lorsque vous travaillez avec de très grandes déclarations if.Traiter les grandes instructions IF en PHP

Merci beaucoup,

+0

Quelle est la taille de vos instructions 'if'? Il est possible qu'ils puissent être simplifiés et selon le type de logique que vous traitez, il pourrait y avoir des alternatives. Néanmoins, si vous postez du code qui serait perspicace. –

+0

Brisez-le en une fonction. – kennytm

+0

Pas exactement sûr de ce que vous voulez dire. Quelque chose comme «sauf» de ruby? –

Répondre

4

Si vous voulez améliorer la lisibilité uniquement, vous pouvez toujours diviser les expressions dans l'instruction if:

$exp1 = is_array($var) && isset($var['key']); 
$exp2 = is_object($var) && isset($var->key); 
$exp3 = substr($string, 0, 4) == 'foo'; 
$exp4 = ($exp1 || $exp2) && $exp3; 
if ($exp4) {} 

au lieu de

if (((is_array($var) && isset($var['key'])) || (is_object($var) && isset($var->key))) && substr($string, 0, 4) == 'foo') {} 

, ceux-ci sont évidemment simplifiées des exemples, mais vous obtenez l'idée ...

+0

J'ai vu beaucoup d'expressions qui couvrent plusieurs lignes. C'est un excellent moyen d'améliorer la lisibilité! –

5

Il n'y a vraiment pas de marteau magique là-bas. Votre meilleur pari pour les rendre gérables est de briser les ifs imbriqués dans leurs propres fonctions pour les rendre plus lisibles.

Aussi, n'oubliez pas array_filter. Cela peut vous éviter d'avoir à écrire une boucle for pour filtrer les éléments.

En outre, vous pouvez éliminer l'imbrication à l'aide de guard statements. En gros, vous inversez votre et faites un return à la place (une autre raison pour casser les conditions en fonctions).

1

Eh bien if est if, il n'y a pas beaucoup d'autre là-bas. Bien sûr, switch est une alternative, mais en fonction des conditions, il pourrait ne pas être applicable.

Si vous faites de la POO, le state design pattern peut être ce dont vous avez besoin.

Sinon, vous devez donner plus d'informations ...

11

Si vous ne pouvez pas lire votre algorithme sur un pli de l'écran, il y a une chance de 99,9% que vous devez factoriser votre code vers plus de lisibilité.

changement

if ($isHappening) { 
    // ... millions of lines of code 
} else { 
    // .. another million lines of code 
} 

dans

if ($isHappening) { 
    happen(); 
} else { 
    didntHappen(); 
} 

function happen() { 
    // millions of lines of code 
} 

function didntHappen() { 
    // another million lines of code 
} 
3

Bienvenue dans le monde de l'objet Orientation :)

class Case1 { 
    function do() { echo "case 1"; } 
} 

class Case2 { 
    function do() { echo "case 2"; } 
} 


$object = new Case1(); 

$object->do(); 

Et puis, il est dispatching en utilisant un tableau:

$choices = array("case1" => new Case1(), "case2" => new Case2(), ...); 

$choices[ $_GET["case"] ]->do(); 
+2

Une astuce, mais peut-être border sur OO-abus. –

+3

Ce que préconise @xtofl, c'est une utilisation intelligente du polymorphisme. Évidemment, il s'agit d'un cas trop simplifié, mais l'utilisation du polymorphisme pour re-refactoriser les instructions complexes if fait partie de la conception OO solide. –

+1

Je peux en témoigner. Après un certain temps avec POO, le concept de longues déclarations compliquées est étranger à moi. Tout est plus court et plus simple maintenant. –

1

Si par "grand" vous entendez "ifs" grand et très imbriqué, c'est un signe évident d'odeur de code, et vous devriez regarder OOP et les modèles de conception.

Questions connexes