Manejando la evolución de aplicaciones web con adaptación - Solarz, Pablo (2004)
La complejidad es una característica inherente al software desde sus orígenes, e igualmente característico es que dicha complejidad crece en consonancia con el universo de roles que desempeña en la actualidad. Permanentemente aparecen nuevas ideas, metodologías y herramientas para hacerle frente, que atacan diferentes aspectos del ciclo de vida de desarrollo de software, o más aún, los enfoques del ciclo mismo. Gran parte de la complejidad tiene que ver con la necesidad de estar preparado para adecuarse permanentemente a nuevos requerimientos. Reusabilidad, encapsulamiento, binding dinámico, han sido respuestas con la que el paradigma de objetos ha respondido a esta problemática y junto a estas, la separación de responsabilidades de un conjunto de parte que cooperan entre si, tiene un lugar destacado como lo demuestra el pattern modelo vista controlador originado en Smalltalk separando y desacoplando tareas de interfase y del modelo de la aplicación. Más allá de interfases y aplicaciones, la separación de responsabilidades y el desacoplamiento entre clases, desde un punto de vista más general, es abordada por una serie de design patterns así como su contraparte necesaria, el aspecto cooperativo entre las mismas. En este último aspecto, el pattern Observer aborda la problemática de un conjunto indeterminado de objetos observadores que requieren ser notificados y actualizados respecto de cambios de estado de otro objeto determinado. El pattern permite la evolución de los observadores, incluso el agregado o eliminación de algunos de ellos sin interferir en el objeto observado, lo que permite disminuir el impacto que cambios de una parte del software, tales como vistas u observadores pueden requerir sobre otra, tales como el modelo o elementos observados. Como cualquier disciplina, el software, y particularmente su diseño, evoluciona a medida que se sistematizan aspectos del mismo. Los design patterns constituyen un hito sustancial en la sistematización de soluciones a problemas que se repiten en el diseño de diversas aplicaciones. Sobre este hito se desarrolla otro, el refactoring o reestructuración de programas orientados a objeto, que tiene por objetivo introducir en forma automática mejoras, en especial design patterns en el código, sin modificar su comportamiento. La reestructuración es un paso previo a la introducción de nuevas prestaciones del software existente.