Creo que esta podría ser una meta-respuesta controvertida, y llego un poco tarde a la fiesta, pero creo que es muy importante mencionar esto aquí, porque creo que sé de dónde vienes.
El problema con la forma en que se usan los patrones de diseño es que, cuando se les enseña, presentan un caso como este:
Tienes este escenario específico. Organiza tu código de esta manera. Aquí hay un ejemplo inteligente, pero un tanto artificial.
El problema es que cuando comienzas a hacer ingeniería real, las cosas no son tan simples. El patrón de diseño sobre el que leyó no se ajustará exactamente al problema que está tratando de resolver. Sin mencionar que las bibliotecas que está utilizando violan totalmente todo lo que se indica en el texto que explica esos patrones, cada uno de manera especial. Y como resultado, el código que escribe "se siente mal" y hace preguntas como esta.
Además de esto, me gustaría citar a Andrei Alexandrescu, cuando hablamos de ingeniería de software, quien afirma:
La ingeniería de software, tal vez más que cualquier otra disciplina de ingeniería, exhibe una rica multiplicidad: puede hacer lo mismo de muchas maneras correctas, y hay infinitos matices entre lo correcto y lo incorrecto.
Tal vez esto sea un poco exagerado, pero creo que esto explica perfectamente una razón adicional por la que podría sentirse menos seguro de su código.
En momentos como este, la voz profética de Mike Acton, líder del motor del juego en Insomniac, grita en mi cabeza:
CONOCE TUS DATOS
Él está hablando de las entradas a su programa y los resultados deseados. Y luego está esta joya de Fred Brooks del Mes del Hombre Mítico:
Muéstrame tus diagramas de flujo y oculta tus tablas, y seguiré desconcertado. Muéstrame tus tablas, y generalmente no necesitaré tus diagramas de flujo; Serán obvios.
Entonces, si fuera usted, razonaría sobre mi problema en función de mi caso típico de entrada y si logra la salida correcta deseada. Y haz preguntas como esta:
- ¿Son correctos los datos de salida de mi programa?
- ¿Se produce de manera eficiente / rápida para mi caso de entrada más común?
- ¿Es mi código lo suficientemente fácil como para razonar localmente, tanto para mí como para mis compañeros de equipo? Si no es así, ¿puedo simplificarlo?
Cuando haces eso, la pregunta de "cuántas capas de abstracción o patrones de diseño se necesitan" se vuelve mucho más fácil de responder. ¿Cuántas capas de abstracción necesitas? Tantas como sea necesario para lograr estos objetivos, y no más. "¿Qué pasa con los patrones de diseño? ¡No he usado ninguno!" Bueno, si los objetivos anteriores se lograron sin la aplicación directa de un patrón, entonces está bien. Haz que funcione y pasa al siguiente problema. Comience desde sus datos, no desde el código.