Digamos que tengo un objeto, Coche, y tiene conjuntos de métodos que son ... dispares? ¿Tal vez tener Blob-como? (como en el antipattern, "blob") Estos métodos operan en conjuntos suficientemente distintos y no se entrecruzan funcionalmente.¿A dónde van los nuevos métodos?
Car
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
Ahora vamos a decir que quería añadir "la conducción fuera de carretera" como uno de los casos que mi objeto coche puede soportar. Si agrego métodos al objeto Car, ¿no es eso lo que lo hace más blando?
Car (augmented)
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
# methods related off road driving
->blah5
->blah6
¿Debo:
A: Subclase de coches. Puedo hacer que OffRoadCar amplíe el objeto Car. ¿Pero qué pasa si Car y OffRoadCar comparten los mismos datos/estado, y solo difieren según los métodos? OffRoadCar solo "actúa" más específicamente que el automóvil, pero no se describe de manera más específica ni tiene campos únicos. Por lo tanto, crear instancias de OffRoadCar no tiene sentido.
OffRoadCar extends Car
# methods related off road driving
->blah5
->blah6
B: Consumir coche con un método estático. Como OffRoadAdventure-> Embark (Car). Entonces, la clase OffRoadAdventure toma un objeto Car y se sale con la suya.
En C# esto se llamaría un método de extensión.
Supongo que dicho de otra manera es ¿cuál es la solución para el antipatrón Blob? ¿Está subclasificando? ¿Son métodos de extensión?
Además, otra razón por la que quería analizar estos métodos es ¿qué ocurre si su implementación implica algún costo, como la inclusión de otras clases/paquetes? No me gustaría que los usuarios de la clase central paguen constantemente por algo que nunca usarían. Me imagino que hacer el costo explícito para la minoría vale la pena el ahorro para la mayoría. Y hace que el gráfico de dependencia sea más preciso (y no como un blob).
PS - El lenguaje de implementación es Perl.
¿El coche tiene que ser una clase? ¿Podría Car realmente ser un ICar (interfaz)? Sugeriría una ruta de composición sobre herencia. – OnResolve
El automóvil ya es una clase real que está en uso. (en realidad es un artefacto ORM) –