Ver Mensaje Individual
  #9 (permalink)  
Antiguo 13/05/2014, 07:53
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Algoritmo en PHP

@dashtrash : no tiene codigo innecesario como Ud dice... Ud asume que jamas se le puede suministrar una precondicion correcta a esa funcion ? o tiene problema porque estan en distintas lineas los chequeos de cada una ?

Sino se van cumpliendo las precondiciones lo devuelve con false, eso no esta "mal" solo que como dice @guardamicorreo no cumple la recomendacion PSR de un solo return()

De todas formas podria ir chequeando precondiciones y sino se cumplen, generar las excepciones correspondientes, lo cual no esta mal si se hacen todos los chequeos al inicio de la funcion o metodo y es como esta hecho:

Código PHP:
Ver original
  1. if (!ctype_digit($str)) return FALSE;
  2.   $len = strlen($str);
  3.   if ($len != 15) return FALSE;


Por que no agrupar las precondiciones en un solo IF() al comienzo de la funcion ?

Código PHP:
Ver original
  1. if ( (!ctype_digit($str)) OR  (strlen($len) != 15) ) return FALSE;

Seria ineficiente (no mucho pero suponiendo nos importa) porque luego NECESITO la longitud de la cadena para seguir con el algoritmo y deberia volver calcularla!

Otra opcion seria:

Código PHP:
Ver original
  1. $len = strlen($str);
  2.  if (!ctype_digit($str)) return FALSE;
  3. if ($len != 15) return FALSE;

<< pero esta peor porque sino son cadenas de numeros para que voy a calcularle la longitud ? encima empujo la verificacion de la primera precondicion mas adentro de la funcion!


Y finalmente... si fuera testarudo y agrupara las verificaciones en una sola linea y luego me dicen que desean que esa funcion genere excepciones me tocaria refactorizar porque son excepciones distintas (si me importa algo claro):

Código PHP:
Ver original
  1. <?php
  2.  
  3. public static function is_valid($str,$error=false)  
  4. {  
  5.   if (!ctype_digit($str))
  6.     if ($error)
  7.         throw new InvalidArgumentException("La cadena no es numerica!");  
  8.     else return False; 
  9.  
  10.   $len = strlen($str);
  11.   if ($len != 15)  
  12.     if ($error)
  13.         throw new LengthException("Longitud incorrecta!");  
  14.     else return False; 
  15.    
  16.   $odd = !strlen($str)%2;
  17.   $sum = 0;
  18.   for ($i=0; $i<$len; ++$i) {
  19.     $n = 0 + $str[$i];
  20.     $odd = !odd;
  21.     if ($odd) {
  22.       $sum += $n;
  23.     } else {
  24.       $x=2*$n;
  25.       $sum += $x>9?$x-9:$x;
  26.     }
  27.   }
  28.   return (($sum%10)==0);
  29. }
__________________
Salu2!

Última edición por Italico76; 13/05/2014 a las 08:30