Técnicas de Diseño Diccionario español Técnica: procedimiento, método, habilidad, destreza, aplicado a un oficio, deporte, ciencia Diseño: verb. Proyectar, trazar, esbozar, delinear, plantear Diseño caracteriza a diseñadores Proceso de diseño caracteriza a “desarrolladores” Pasos de un buen diseño 1. Entender el problema a resolver 1. Elaborar el diseño que mejor soporte la solución al problema a resolver Algunas definiciones Software + Hardware = Sistema Diseño + Código = Software Código + Ambiente = Programa Programa = lista de tareas escritas en un Lenguaje Lenguaje = Vocabulario + Reglas Lenguaje tiene Modelo de Programación Lenguaje implementa un Paradigma Paradigma es una forma de pensar los problemas, un enfoque , una perspectiva, una mirada desde un lugar determinado Características del Software Chico Grande Corta vida Larga vida Estático Cambios frecuentes Aislado Conectado - complejidad + Integridad conceptual The mythical man – month, Frederick Brooks Jr., 1975/95 Integridad conceptual y la complejidad. Mural de Diego Rivera, Legislatura de México, DF Integridad conceptual y la simplicidad. La paz, Pablo Picasso Dependencias de las Técnicas de Diseño Requerimientos: funcionales y no funcionales Paradigma: procedural, orientado a objetos, lógico, funcional, programación genérica, etc. Metodología de desarrollo: catedral vs bazar Tecnología: lenguajes de programación Requerimientos Requerimientos Paradigma tomada del libro de G.Booch Metodología de desarrollo La catedral y el bazar, Eric Steven Raymond, www.tuxedo.org/~esr/writings Tecnología Inspirada en las ideas de Grady Booch – Object Oriented Software Analysis and Design with applications, 1992. Prehistoria (antes de 1960): masa uniforme Edad Antigua (década del 60): subrutinas Edad Media (década del 70): módulos Edad Moderna (década del 80): objetos Edad Contemporanea (2010): multiparadigma Prehistoria Edad Antigua Criterios de buen diseño Cohesión de subrutinas alta Acoplamiento de subrutinas bajo Minimizar cantidad de parámetros pasados a subrutinas Orden de parámetros pasados a subrutinas Algoritmos eficientes en subrutinas Edad Media Criterios de buen diseño Cohesión de subrutinas alta Acoplamiento de subrutinas bajo Minimizar cantidad de parámetros pasados a subrutinas Orden de parámetros pasados a subrutinas Algoritmos eficientes en subrutinas Cohesión de módulos alta Acoplameinto de módulos baja Ocultamiento de datos en módulos Edad Moderna Criterios de buen diseño Cohesión de métodos alta Acoplamiento de métodos bajo Minimizar cantidad de parámetros pasados a métodos Orden de parámetros pasados a métodos Algoritmos eficientes en métodos Cohesión de módulos alta Acoplameinto de módulos baja Ocultamiento de datos en módulos Inversión en la cadena de dependencia Principio de substitución de Liskov Código clausurado ante cambios Segregación de interfaces Edad Moderna, continuación Criterios de buen diseño Detectar la dirección del vector de cambios Encapsular lo que varía Separación de incumbencias Diseño simple NO dependencias cíclicas Edad Contemporanea Criterios de buen diseño Inversión en la Cadena de Dependencia Principio de substitución de Liskov Código clausurado ante cambios Segregación de Interfaces Separación de incumbencias Demeter Law Dependencia de los más estables Dependencias NO cíclicas Ejemplos. Criterios de buen diseño Los detalles dependen de las generalidades Dependencias en la dirección y sentido de los componentes más estables Abstracción = Generalidad Dependiente = Inestabilidad Criterios de buen diseño Criterios de buen diseño Dependencia de las generalidades Dependencias NO cíclicas Criterios de buen diseño Criterios de buen diseño Dependencia de los componentes más estables Criterios de buen diseño Criterios de buen diseño Inversión en la Cadena de Dependencia Abs = Cant Cabs / (Cant Cabs + Cant Cconcr) Ines = Cant Rsal / (Cant Rsal + Cant Rentr) Criterios de buen diseño Criterios de buen diseño Substitución de Liskov Criterios de buen diseño Criterios de buen diseño Código clausurado ante cambios Criterios de buen diseño Criterios de buen diseño Segregación de interfaces Criterios de buen diseño Criterios de buen diseño Separación de incumbencias Criterios de buen diseño Criterios de buen diseño Demeter Law Criterios de buen diseño Criterios de buen diseño Demeter Law public void plotDate(Date aDate, Selection aSelection) { TimeZone tz = aSelection.getRecorder().getLocation().getTimeZone(); ... } // acoplado a tres clases Selection, Recorder, and Location public void plotDate(Date aDate, TimeZone aTz) { ... } // solo depende de las necesidades del código tra haber // agregado un método a Selection que devuelve la zona plotDate(someDate, someSelection.getTimeZone()); Criterios de buen diseño Ejemplos