(26-10-2010 01:14 AM)hmorillo escribió: Faltó el mas ilegible, pero de una sola linea:
Código:
printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), ($i % 2 == 0) ? "#D6E7FF" : "#C2DCFF");
Jeje, si Hugo, tienes razón, aunque tengo algunas anécdotas bastante curiosas sobre el uso y abuso del <cond>?<exp-t>:<exp-f>. Creo que personalmente me quedo con la segunda opción, parafraseando al Profesor Leandro: No es buena idea tratar de hacer mucho en una misma línea, porque le quita legibilidad al código.
Por eso soy un tanto crítico con el argumento que usan algunos defensores de Ruby en el que sugieren que con éste lenguaje implementan en una línea de código algo que en Java se implementa en 6 o 7 líneas. Creo que en ese caso la legibilidad sufre mucho.
Últimamente he estado pensando mucho en el concepto de "Responsabilidad" que se suele aplicar al diseño orientado a objetos y a la arquitectura del software, y que en mi opinión se puede aplicar a esto también. Me explico, cuando uno hace diseño orientado a objeto, generalmente trata que cada clase tenga una (o más) responsabilidades bien definidas. En general cuando hablo de una responsabilidad me refiero a lo que la clase "debe hacer". Si uno no tiene claras las responsabilidades de una clase entonces simplemente no puede implementarla. Luego uno trata de que si una clase tiene varias responsabilidades estas sean coherentes entre si, a esto se le llama cohesión. Si una clase tiene muchas, pero muchas responsabilidades simultáneamente esto hace que aumenten las probabilidades de que estas sean incoherentes entre si y por lo tanto la clase se vuelve confusa y difícil de implementar.
Un ejemplo si pensamos en términos de línea blanca:
Si tenemos la clase
Lavadora, su responsabilidad será
Lavar: Una sola responsabilidad, simple y sencilla.
Si tenemos la clase
Secadora, su responsabilidad será
Secar: Igual, una sola responsabilidad, simple y sencilla.
Si tenemos una clase
LavadoraSecadora, sus responsabilidades serían
Lavar y
Secar: Dos responsabilidades, que pueden ser coherentes entre si y pueden tener sentido para algunos clientes. Es decir, existe cohesión entre las múltiples responsabilidades de la clase.
Pero si tenemos una clase
Lava-Seca-De-Todo-Multifuncional, cuyas responsabilidades son
Lavar,
Secar,
Fotocopiar,
Reproducir CDs,
Servir de Reloj Despertador y además tiene
"Fax Modem" incorporado... bueno, en fin, las múltiples responsabilidades puede que no estén claras, y de hecho puede que generen algo de confusión en los clientes. Es decir, las responsabilidades no son coherentes entre si, quizá sería mejor comprar la
LavadoraSecadora por un lado y los demás accesorios por separado...
¿Ahora bien, a que viene todo esto en relación con el problema planteado en este post? A que podemos hacer un análisis similar, en el sentido de que si vemos cada línea de código como una construcción dentro de un programa que tiene una responsabilidad particular entonces podemos definir claramente que (cuantas) responsabilidades tiene cada línea y ver si estamos haciendo algo como lo que menciono en el
Lava-Seca-De-Todo-Multifuncional
(Continua en el siguiente mensaje)