design - patterns - refactoring java
"Cadenas de mensajes" frente a "Hombre medio" (3)
Como dijo Hammar, este es todo acerca de la Ley de Demeter. Cosas como a.getB().getC().getD()
son casi siempre malas. Introducen el acoplamiento al cliente de la interfaz A. Prefiere presentar a un intermediario, como por ejemplo:
class A
def calculateHowManyCowsCanFitOnTheMoon
doLocalCalculation(b.performEncapsulatedCalculation())
end
end
Quieres deshacerte del Hombre Medio cuando no está cumpliendo un propósito como el anterior, como cuando solo está sacando datos de B. Hasta llegar a decir que la refacturación para un Malvado Medio podría ser el Campo de Mover / Mover la refactorización del método .
Estoy leyendo el libro de refactorización de Fowler y estoy un poco confundido acerca de esos dos olores de código.
Las "cadenas de mensajes" son llamadas como a.getB().getC().getValue()
.
"Middle Man" es un método como
class A
{
object getCValue()
{
return b.getCValue();
}
}
La forma en que entiendo las dos secciones es que si tienes "Cadenas de mensajes" las acortan presentando "Hombres medios". Y si tienes "Hombres medianos" los conviertes en "Cadenas de mensajes" ...
Ahora, obviamente, tiene que haber alguna limitación en esto o tendrías el tiovivo de un programador. ¿En qué punto debería favorecer a uno sobre el otro?
Uno de ellos es el acoplamiento de la clase a clases no relacionadas, el otro es el acoplamiento de la clase a la estructura. Entonces, en teoría, mi enfoque sería verificar si un cambio determinado reduce un tipo de acoplamiento más de lo que aumenta el otro tipo de acoplamiento. Pero, ¿hay un tipo de acoplamiento peor y debería pesarse más? ¿Es solo agregar un acoplamiento de clase si puede quitar los acoplamientos estructurales X?
Es tu elección. Codifíquelo de la manera que crea que será más fácil de mantener. Por cierto, no creo que haya un caso de "acoplar la clase a clases no relacionadas". Más bien, se trata de convertir una relación indirecta en una relación directa. Esto es particularmente útil cuando accedes a la clase indirecta varias veces desde tu clase. Esto también podría eliminar algunas dependencias de las clases intermedias, según cómo establezca la relación directa.
Preferir a los hombres medios sobre las cadenas de mensajes también se conoce como la Ley de Demeter , que se puede resumir como "solo habla con tus dependencias directas".
Un beneficio del uso de intermediarios en lugar de cadenas de mensajes es que debe proporcionar menos burlas al realizar pruebas unitarias. Las clases se vuelven realmente difíciles de probar cuando debe proporcionar burlas no solo para sus dependencias directas sino también indirectas.
También ayuda con la separación de preocupaciones, ya que el código que tiene una A
y quiere una C
no debería tener que saber que hay una B
involucrada. Esto ayuda a la modularidad.
El argumento principal para las cadenas de mensajes es que no tiene que escribir el texto repetido en el medio, y podría tener sentido en algunos casos, pero creo que la regla de oro debería ser preferir a los intermediarios.