2010-08-03 2 views
10

Je m'informais simplement des pratiques standard de syntaxe de validation d'argument. Je travaille avec PHP à partir de maintenant, mais tout ce qui est considéré comme une solution agnostique de plate-forme/langue serait génial.Normes de validation d'argument de fonction/méthode

En ce moment, je suis conscient de deux syntaxe assez commune. Par exemple (ma préférence):

function foo($a, $b, $c){ 
    if(!$a){ throw new Exception(); } 
    if($b < 0){ throw new Exception(); } 
    if(!check($c)){ throw new Exception(); } 

    //do stuff with $a, $b, and $c 

} 

Et encore:

function foo($a, $b, $c){ 
    if($a){ 
     if($b >= 0){ 
      if(check($c)){ 

       //do stuff with $a, $b, and $c 

      }else{ throw new Exception(); } 
     }else{ throw new Exception(); } 
    }else{ throw new Exception(); } 
} 

Dans tous les cas, si quelqu'un sait de la documentation qui illustre toute sorte de normes ou de pratiques communes à ce sujet, je serais très reconnaissant une référence. Bien sûr, les préférences personnelles et les opinions sont plus que bienvenues, mais le raisonnement de vos choix serait un atout.

Répondre

6

Je préfère l'ancien exemple que vous donnez pour plusieurs raisons:

  • Code ne qu'il ne soit pas inutilement en retrait avec imbriquée si les déclarations.
  • Les instructions imbriquées peuvent ajouter un tas de branches compliquées au flux logique qui devient difficile à gérer
  • Les conditions préalables sont déplacées plus bas par nature des instructions if. Je préfère avoir toutes les conditions préalables immédiatement au début de la méthode

Design by contrat est l'approche générale pour assurer certaines conditions sont remplies (généralement par des affirmations) telles que:

Assert.IsNotNull($a, '$a must not be null'); 

Si l'assertion échoue, une exception est levée avec le message spécifié. En utilisant la même approche, vous pouvez faire certaines affirmations à la fin de la méthode (post-conditions) pour vous assurer que la méthode est exécutée comme prévu.

+1

Merci Michael - qui est la même méthode que je préfère. Des suggestions de classes Assertion existantes pour valider/lancer des exceptions? Je suppose que la conception d'une classe Assertion efficace étendrait la classe Exception existante, correct? Des suggestions sur où commencer à écrire mon propre? – Dan

1

Sinon, le groupe l'ensemble des essais si ensemble dans un seul « instruction if »:

function foo($a, $b, $c) { 
    if ((!$a) || 
     ($b < 0) || 
     (!check($c))) { 
     throw new Exception(); 
    } 

    //do stuff with $a, $b, and $c 
}