Esta es una pregunta bastante vaga, pero es algo que nunca he sentido que haya sido respondida de manera satisfactoria al leer sobre el diseño adecuado.
En general, al aprender sobre programación orientada a objetos, abstracción, factorización, etc., el santo grial del diseño, y la razón por la que siempre afirman que está utilizando las técnicas de desarrollo en cuestión, es que hará que su programa sea "fácil de cambiar" , "mantenible", "flexible", o cualquiera de los sinónimos utilizados para expresar un concepto tan productivo. Al marcar los ivars como privados, dividiendo el código en muchos métodos pequeños y autónomos, manteniendo las interfaces generales, supuestamente obtienes la capacidad de modificar tu programa con total facilidad y gracia.
Para cambios relativamente pequeños, esto ha funcionado bien para mí. Los cambios en las estructuras de datos internos utilizados por una clase para aumentar el rendimiento nunca han sido una gran dificultad, y tampoco lo han hecho los cambios en el extremo de la interfaz de usuario, independientemente de la API, como el rediseño de un sistema de entrada de texto o la revisión de los gráficos para un elemento de juego .
Todos estos cambios parecen inherentemente autónomos. Ninguno de ellos implica ningún cambio en el comportamiento o diseño del componente de su programa que se está modificando, en lo que respecta al código externo en cuestión. Ya sea que esté escribiendo o no de forma procedimental o en un estilo OO, con funciones grandes o pequeñas, estos son cambios fáciles de realizar incluso si tiene un diseño moderadamente bueno.
Sin embargo, cada vez que los cambios se vuelven grandes y difíciles, es decir, cambios en la API, ninguno de mis preciosos "patrones" viene al rescate. El gran cambio sigue siendo grande, el código afectado sigue afectado y muchas horas de trabajo de generación de errores me esperan.
Así que mi pregunta es esta. ¿Qué tan grande es el cambio que el diseño apropiado dice que puede facilitar? ¿Existe alguna técnica de diseño adicional, ya sea desconocida para mí o que no he podido implementar, que realmente hace que la modificación de sonido pegajoso sea simple, o esa promesa (que he escuchado hecha por tantos paradigmas diferentes) es simplemente una buena idea, completamente desconectado de las verdades inmutables del desarrollo de software? ¿Existe una "herramienta de cambio" que pueda agregar a mi cinturón de herramientas?
Específicamente, el problema al que me enfrento que me llevó a los foros es este: he estado trabajando en la implementación de un lenguaje de programación interpretado (implementado en D, pero eso no es relevante), y he decidido que los argumentos de mis cierres deberían ser basado en palabras clave, en lugar de posicional como lo son actualmente. Esto requiere modificar todo el código existente que llama funciones anónimas, que, por suerte, es bastante pequeño porque estoy en el desarrollo de mi lenguaje (<2000 líneas), pero sería enorme si hubiera tomado esta decisión en una etapa posterior. En tal situación, ¿hay alguna manera de que, mediante una previsión adecuada en el diseño, podría haber hecho esta modificación más fácil, o hay ciertos (la mayoría) cambios intrínsecamente de gran alcance? Tengo curiosidad si esto es de alguna manera un fracaso de mis propias habilidades de diseño; si lo es, yo '
Para ser claros, no soy en absoluto escéptico con respecto a la POO ni a ninguno de los otros patrones comúnmente utilizados. Para mí, sin embargo, sus virtudes están en la escritura original, más que en el mantenimiento de las bases de código. La herencia le permite abstraer bien los patrones repetitivos, el polimorfismo le permite separar el código por función entendida por el ser humano (qué clase) en lugar de por efecto entendido por la máquina (qué rama de la switch
declaración), y las funciones pequeñas y autónomas le permiten escriba en un estilo "de abajo hacia arriba" muy agradable. Sin embargo, soy escéptico de sus reclamos de flexibilidad.
foo metarg1: bar metarg2: baz
como foo.metarg1_metarg2_(bar, baz)
. Sin embargo, mi idioma está haciendo un cambio mayor, es decir, los parámetros basados en la lista a los parámetros basados en el diccionario, lo que afecta el tiempo de ejecución pero no el analizador, en realidad, debido a las propiedades específicas de mi idioma que no entraré en este momento. Dado que no hay un mapeo claro entre palabras clave desordenadas y argumentos posicionales, el tiempo de ejecución es el problema principal.