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 SÓLIDOS y utiliza patrones de diseño comunes, introducirá cierta complejidad a medida que se agreguen o cambien características y requisitos para mantener su diseño tan sostenible y flexible como sea necesario.
Sin embargo, una vez que se introduce esa complejidad y funciona como un campeón, ¿cuándo la eliminas?
Ejemplo. Tengo una solicitud escrita para un cliente. Cuando se creó originalmente allí, donde hay varias formas de dar aumentos a los empleados. Utilicé el patrón estratégico y la fábrica para mantener todo el proceso limpio y agradable. Con el tiempo, ciertos métodos de aumento fueron agregados o eliminados por el propietario de la aplicación.
El tiempo pasa y el nuevo dueño se hace cargo. Este nuevo propietario es duro, mantiene todo simple y solo tiene una sola forma de dar un aumento.
La complejidad que necesita el patrón de estrategia ya no es necesaria. Si codificara esto a partir de los requisitos tal como están ahora, no introduciría esta complejidad adicional (pero asegúrese de poder introducirla 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 la forma en que se otorgan los aumentos. Pero la aplicación en sí ha demostrado que esto podría suceder.
Por supuesto, este es solo un ejemplo en una aplicación donde un nuevo propietario se hace cargo 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 simple. Tenga en cuenta que la implementación actual funciona bien y el propietario está contento con ella (y sorprendido e incluso más feliz de que pude implementar sus cambios tan rápido debido a la complejidad discutida).
Admito que una pequeña parte de esta duda se debe a que es muy probable que el nuevo propietario ya no me use. Realmente no me importa que alguien más se haga cargo de esto, ya que no ha sido un gran generador de ingresos.
Pero me importan 2 cosas (relacionadas)
Me importa un poco que el nuevo responsable tenga que pensar un poco más cuando intente comprender el código. La complejidad es complejidad y no quiero enojar al psico maníaco 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 aumentar mis horas de trabajo. Luego, difundir este rumor para dañar mis otros asuntos. (He escuchado esto mencionado).
Entonces...
En general, ¿debería eliminarse previamente la complejidad necesaria aunque funcione y ha habido una necesidad históricamente demostrada de la complejidad pero no tiene indicios de que será necesaria en el futuro?
Incluso si la pregunta anterior generalmente se responde "no", ¿es prudente eliminar esta complejidad "innecesaria" si se entrega el proyecto a un competidor (o extraño)?