TL; DR: depende de lo que intentes resolver.
Tuve una conversación similar con mis abuelos sobre esto, mientras estábamos hablando de cómo Func y Action en C # son increíbles. My Gramps es un programador de temporizador muy antiguo, que ha estado relacionado con los códigos fuente desde que el software se ejecutó en computadoras que ocuparon toda una habitación.
Cambió de técnico varias veces en su vida. Escribió código en C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java y finalmente comenzó C # como un hobby. Aprendí a programar con él, sentándome en su regazo mientras no era más que un devling, quitando mis primeras líneas de código en el editor azul de SideKick de IBM. Cuando tenía 20 años, ya había pasado más tiempo codificando que jugando afuera.
Esos son algunos de mis recuerdos, así que discúlpeme si no soy exactamente práctico mientras los vuelvo a contar. Soy un poco aficionado a esos momentos.
Eso es lo que me dijo:
"¿Deberíamos buscar la generalización de un problema o resolverlo en el ámbito específico, pregunta? Bueno, esa es una ... pregunta".
Gramps hizo una pausa para pensarlo por un breve momento, mientras fijaba la posición de sus lentes en su rostro. Estaba jugando un juego de combinar 3 en su computadora, mientras escuchaba un LP de Deep Purple en su antiguo sistema de sonido.
"Bueno, eso dependería de qué problema estés tratando de resolver", me dijo. "Es tentador creer que existe una única solución sagrada para todas las opciones de diseño, pero no hay una. La arquitectura de software es como el queso".
"... Queso, abuelo?"
"No importa lo que pienses sobre tu favorito, siempre habrá alguien que piense que es maloliente".
Parpadeé confundido por un momento, pero antes de que pudiera decir algo, Gramps continuó.
"Cuando estás construyendo un auto, ¿cómo eliges el material para una parte?"
"Yo ... supongo que depende de los costos involucrados y de lo que debe hacer la parte, supongo".
"Depende del problema que la parte esté tratando de resolver. No harás una llanta de acero o un parabrisas de cuero. Escoges el material que mejor resuelva el problema que tienes a mano. Ahora, ¿qué es un ¿Solución genérica? ¿O específica? ¿Para qué problema, para qué caso de uso? ¿Debería adoptar un enfoque funcional completo para dar la máxima flexibilidad a un código que se utilizará solo una vez? ¿Debería escribir un código muy especializado y frágil para una parte de su sistema que verá muchos usos y posiblemente muchos cambios? Las opciones de diseño como esas son los materiales que elige para una parte de un automóvil o la forma del ladrillo de Lego que elige para construir una pequeña casa ¿Qué ladrillo de Lego es el mejor?
El programador anciano buscó un pequeño modelo de tren de Lego que tiene sobre su mesa antes de continuar.
"Solo puedes responder eso si sabes para qué necesitas ese ladrillo. Cómo demonios sabrás si la solución específica es mejor que la genérica, o viceversa, si ni siquiera sabes qué problema tienes tratando de resolver? No puedes ver más allá de una elección que no entiendes ".
"... ¿Acabas de citar The Matrix? "
"¿Qué?"
"Nada, continúa".
"Bueno, supongamos que estás tratando de construir algo para el Sistema Nacional de Facturas. Sabes cómo se vería esa API infernal y su archivo XML de treinta mil líneas desde adentro. ¿Cómo se vería una solución 'genérica' para crear ese archivo? el archivo está lleno de parámetros opcionales, lleno de casos que solo las ramas de negocios específicas deberían usar. En la mayoría de los casos, puede ignorarlos de manera segura. No es necesario crear un sistema de factura genérico si lo único que usted necesita es " alguna vez venderé zapatos. Simplemente cree un sistema para vender zapatos y conviértalo en el mejor sistema de facturación de ventas de zapatos. Ahora, si tuviera que crear un sistema de facturación para cualquier tipo de cliente, en una aplicación más amplia: para ser revendido como un sistema de ventas independiente y genérico,por ejemplo, ahora es interesante implementar esas opciones que solo se usan para gas, alimentos o alcohol.Ahora esos son posibles casos de uso. Antes eran solo algunos casos hipotéticos de No usar , y no desea implementar No usar casos. No usar es el hermano pequeño de No necesito ".
Gramps volvió a colocar el tren de lego en su lugar y volvió a su juego de combinar 3.
"Por lo tanto, para poder elegir una solución genérica o específica para un problema dado, primero debes comprender cuál es ese problema. De lo contrario, solo estás adivinando, y adivinar es el trabajo de los gerentes, no de los programadores. Como casi todo en TI, depende ".
Entonces, ahí lo tienes. "Depende". Esa es probablemente la expresión de dos palabras más poderosa cuando se piensa en el diseño de software.