La introducción prematura de la complejidad mediante la implementación de patrones de diseño antes de que sean necesarios no es una buena práctica.
Pero si sigue todos (o incluso la mayoría de) los principios de SOLID y utiliza patrones de diseño comunes, introducirá cierta complejidad a medida que las características y los requisitos se agreguen o modifiquen para mantener su diseño tan flexible y flexible como sea necesario.
Sin embargo, una vez que se introduce esa complejidad y funciona como un campeón, ¿cuándo la eliminaste?
Ejemplo. Tengo una aplicación escrita para un cliente. Cuando se creó originalmente allí, hay varias formas de dar aumentos a los empleados. Utilicé el patrón de estrategia y la fábrica para mantener todo el proceso agradable y limpio. Con el tiempo, ciertos métodos de subida fueron agregados o eliminados por el propietario de la aplicación.
El tiempo pasa y el nuevo propietario se hace cargo. Este nuevo propietario es duro, mantiene todo simple y solo tiene una forma de dar un aumento.
La complejidad que necesita el patrón de estrategia ya no es necesaria. Si pudiera codificar esto a partir de los requisitos tal como están ahora, no introduciría esta complejidad adicional (pero asegúrese de poder hacerlo con poco o ningún trabajo si fuera necesario).
¿Entonces elimino la implementación de la estrategia ahora? No creo que este nuevo propietario cambie nunca la forma en que se dan los aumentos. Pero la aplicación en sí ha demostrado que esto podría suceder.
Por supuesto, esto es solo un ejemplo en una aplicación donde un nuevo propietario asume el control y ha simplificado muchos procesos. Podría eliminar docenas de clases, interfaces y fábricas y hacer que toda la aplicación sea mucho más sencilla. Tenga en cuenta que la implementación actual funciona bien y el propietario está contento con ella (y sorprendido y aún más feliz de haber podido implementar sus cambios tan rápidamente debido a la complejidad comentada).
Admito que una pequeña parte de esta duda es porque es muy probable que el nuevo propietario no me vaya a usar más. Realmente no me importa que alguien más se encargue de esto, ya que no ha sido un gran generador de ingresos.
Pero sí me importan 2 cosas (relacionadas)
-
Me importa un poco que el nuevo mantenedor tenga que pensar un poco más cuando intente entender el código. La complejidad es complejidad y no quiero enojar a la psico maníaca que viene detrás de mí.
-
Pero aún más me preocupa que un competidor vea esta complejidad y piense que solo implemento patrones de diseño para llenar mis horas de trabajo. Luego difundir este rumor para lastimar mi otro negocio. (He escuchado esto mencionado).
Entonces ...
En general, debe eliminarse la complejidad necesaria anteriormente, aunque funcione y haya habido una necesidad histórica demostrada de complejidad, pero ¿no tiene ninguna indicación de que sea necesaria en el futuro?
Incluso si a la pregunta anterior generalmente se responde "no", ¿es aconsejable eliminar esta complejidad "innecesaria" si se entrega el proyecto a un competidor (o un extraño)?