Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
¿Qué es mejor?
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #1
¿Qué es mejor?
Esto:

Código:
if($i % 2 == 0) {
  printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), "#D6E7FF");
} else {
  printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), "#C2DCFF" );
}

ó esto:

Código:
if($i % 2 == 0) {
  $color = "#D6E7FF";
} else {
  $color = "#C2DCFF";
}

printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), $color );

¿Por qué?

(PS: ¿Qué nombre le podemos poner al post para identificarlo claramente?)

[Imagen: dmi-1.jpg]
(Este mensaje fue modificado por última vez en: 25-10-2010 12:00 AM por demian.)
25-10-2010 12:00 AM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Hernan Garcia Sin conexión
Padawan
****

Mensajes: 84
Registro en: Jun 2010
Reputación: 0
Mensaje: #2
RE: ¿Qué es mejor?
Me gusta más el de abajo por que es maś legible... la desventaja es que utiliza un poco más de memoria.

[Imagen: signature.jpg]
25-10-2010 10:39 AM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #3
RE: ¿Qué es mejor?
(25-10-2010 10:39 AM)Hernan Garcia escribió:  Me gusta más el de abajo por que es maś legible... la desventaja es que utiliza un poco más de memoria.

Si, en mi opinión el de abajo es considerablemente mejor.

Por un lado el llamado a printProductData está en el código una sola vez, así que si cambia algo en la firma de la función posteriormente es un cambio menos que cuidar. Es definitivamente más legible porque deja claro que el if sólo afecta al color, en el código de arriba tenemos que ponernos a leer un poco la expresión para tener claro eso. En cuanto al uso de memoria es absolutamente insignificante, en el 99.9999999% de los casos creo que no sacrificaría legibilidad en aras de ahorrarme una variable global, recuerden esa máxima de no optimizar (o sobre-optimizar) antes de tiempo.

¡Buen Juicio Hernan!

¿Se dan cuenta de todo el jugo que le podemos sacar a una pequeña porción de código?

[Imagen: dmi-1.jpg]
25-10-2010 07:15 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
hmorillo Sin conexión
lider de proyecto
****

Mensajes: 79
Registro en: Jun 2010
Reputación: 0
Mensaje: #4
RE: ¿Qué es mejor?
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");
(Este mensaje fue modificado por última vez en: 26-10-2010 01:16 AM por hmorillo.)
26-10-2010 01:14 AM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Hernan Garcia Sin conexión
Padawan
****

Mensajes: 84
Registro en: Jun 2010
Reputación: 0
Mensaje: #5
RE: ¿Qué es mejor?
LOL!....

[Imagen: signature.jpg]
26-10-2010 08:34 AM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #6
RE: ¿Qué es mejor?
(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)

[Imagen: dmi-1.jpg]
26-10-2010 08:42 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #7
RE: ¿Qué es mejor?
Caso 1

Código:
if($i % 2 == 0) {
  printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), "#D6E7FF");
} else {
  printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), "#C2DCFF" );
}

Si asumo el if como un solo bloque puedo decir que tiene dos responsabilidades: 1 determinar el color, 2 llamar a printProductData (1 bloque/línea dos responsabilidades)

Caso 2

Código:
if($i % 2 == 0) {
  $color = "#D6E7FF";
} else {
  $color = "#C2DCFF";
}

printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), $color );

Si vemos el if como un solo bloque tal como en el Caso 1 entonces tenemos 1 bloque y una línea. El bloque tiene 1 sola responsabilidad: determinar el color, y la línea tiene siguiente tiene una sola responsabilidad: Llamar a printProductData. Es decir, 2 líneas/bloques con 1 responsabilidad cada uno (o cada bloque línea con una sola responsabilidad)

Caso 3

Código:
printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), ($i % 2 == 0) ? "#D6E7FF" : "#C2DCFF");

Se puede aplicar el mismo razonamiento del caso 1: Una sola línea 2 responsabilidades (solo que sin el bloque if/else.

Y todo esto me hace pensar en una alternativa que me parece la más razonable de todas:

Caso 4

Código:
$color = ($i % 2 == 0 ? "#D6E7FF" : "#C2DCFF");

printProductData($act, $met1, $met2, $productBeanList[$i]->getName(), $productBeanList[$i]->getDescription(), $color);

Es similar al caso 2, con todas sus ventajas, es decir, dos líneas con una responsabilidad cada una, pero eliminando (o abreviando el bloque if/else).

PS1: Si, estoy loco, ya me lo han dicho antes, pero no me pude resistir al ejercicio mental de hacer este pequeño análisis Wink

PS2: Escribí muy rápido, si alguien ve un typo o alguna inconsistencia en el texto me dice.

[Imagen: dmi-1.jpg]
26-10-2010 09:06 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 2 invitado(s)