2010-08-03 12 views
10

Solo estaba preguntando sobre prácticas estándar de sintaxis de validación de argumentos. Actualmente estoy trabajando con PHP, pero cualquier cosa que se considere una solución independiente de plataforma/lenguaje sería genial.Criterios de validación de argumentos de función/método

En este momento, conozco dos sintaxis bastante comunes. Por ejemplo (mi preferencia):

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 

} 

y alternativamente:

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(); } 
} 

En cualquier caso, si alguien sabe de documentación que ilustra ningún tipo de normas o prácticas comunes con respecto a esto, yo agradecería mucho una referencia.

Por supuesto, las preferencias y opiniones personales son más que bienvenidas, pero el razonamiento para sus elecciones sería una ventaja.

Respuesta

6

Yo prefiero el ejemplo anterior se da por un número de razones:

  • Código no quede innecesariamente sangría como lo hace con if anidadas.
  • Anidado si las sentencias pueden agregar un montón de ramas complicadas al flujo lógico que se vuelven difíciles de administrar
  • Las condiciones previas se bajan más abajo por la naturaleza de las declaraciones if. Yo prefiero tener todas las condiciones previas de inmediato al comienzo del método

Diseño de contrato es el enfoque general para garantizar se cumplan ciertas condiciones (por lo general a través de afirmaciones), tales como:

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

Si la afirmación falla, se lanza una excepción con el mensaje especificado.

Usando el mismo enfoque, puede realizar ciertas afirmaciones al final del método (condiciones posteriores) para garantizar que el método se ejecute como se espera.

+1

Gracias Michael - Ese es el mismo método que prefiero. ¿Alguna sugerencia de clases de Afirmación existentes para validar/lanzar excepciones? Supongo que un diseño efectivo de clase de Aserción, extendería la clase existente de Excepción, ¿correcto? ¿Alguna sugerencia sobre dónde comenzar a escribir la mía? – Dan

1

Alternativamente, el conjunto de grupo si las pruebas juntos en un "estado de cuenta si" single:

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

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