@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:
Por que no agrupar las precondiciones en un solo IF() al comienzo de la funcion ?
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:
<< 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<?php
public static function is_valid($str,$error=false)
{
if ($error)
throw new InvalidArgumentException("La cadena no es numerica!");
else return False;
if ($len != 15)
if ($error)
throw new LengthException("Longitud incorrecta!");
else return False;
$sum = 0;
for ($i=0; $i<$len; ++$i) {
$n = 0 + $str[$i];
$odd = !odd;
if ($odd) {
$sum += $n;
} else {
$x=2*$n;
$sum += $x>9?$x-9:$x;
}
}
return (($sum%10)==0);
}