1. Definido como
1.1. Proceso de definición
1.1.1. Arquitectura
1.1.2. Componentes
1.1.3. Interfaces
1.2. Análisis de requerimientos
1.2.1. Base para la estructura del software
2. Resultado --> Arquitectura del Software
3. 1. Fundamentos del Diseño de Software
3.1. Conceptos Generales
3.1.1. Forma de solución de problemas
3.1.1.1. Alternativas
3.1.1.2. Representación de soluciones
3.2. Contexto
3.2.1. Rol
3.2.1.1. Análisis de Requerimientos
3.2.1.2. Diseño
3.2.1.3. Construcción
3.2.1.4. Pruebas (testing)
3.3. Proceso
3.3.1. Consta de dos actividades
3.3.1.1. Diseño Arquitectónico de Software
3.3.1.1.1. Estructura y Organización de los componentes
3.3.1.2. Diseño Detallado de Software
3.3.1.2.1. Descripción detallada de cada componente
3.4. Técnicas
3.4.1. Abstracción
3.4.2. Acoplamiento y cohesión
3.4.2.1. Fuerza de las relaciones entre modulos
3.4.2.2. Cómo se relacionan los elementos que componen un módulo
3.4.3. Descomposición y Modularización
3.4.3.1. Colocar diferentes funcionalidades o responsabilidades en diferentes componentes ("Divide y vencerás")
3.4.4. Esconder información
3.4.4.1. Agrupar detalles internos y hacerlos inaccesibles
3.4.5. Separación de Interfaz - Implementación
3.4.5.1. Programar en capas, lo que el usuario ve y lo que el usuario no puede ver
3.4.6. Suficiencia, integridad y primitividad
3.4.6.1. Un componente del software captura toda la información importante de una abstracción y nada más
4. Cualidades de calidad
4.1. En ejecucion
4.1.1. Desempeño, seguridad, disponibilidad, funcionalidad y usabilidad
4.2. En compilación
4.2.1. Editabilidad, portabilidad, reusabilidad, integridad y capacidad para pruebas
5. Estrategias del diseño y metodologias
5.1. Estrategias generales
5.1.1. Divide y venceras
5.1.2. Heuristicas
5.1.3. Patrones
5.1.4. Acercamiento incremetivos e iterativos
5.2. Diseño orientada a funciones
5.2.1. Descomposición de funciones mayores en el software y su jerarquía
5.2.2. Diseño estructurado y analisis estructurado, diagramas de flujo de información y descripción de procesos
5.3. Diseño orientado a objetos
5.3.1. sustantivo = objeto, verbo = metodo, adjetivo = atributo Donde la herencia y el polimorfismo juegan un papel importante así como la abstracción de información
5.4. Diseño enfocado en estructuras de datos
5.4.1. Empieza por las estructuras en vez de hacerlo por las funciones, el ingeniero describe las entradas y salidas de las estructuras
5.5. Diseño basado en componentes
5.5.1. Produce un software independientes dividido en unidades, con interfaces bien definidas que poseen buen desacoplamiento
5.6. Otros
5.6.1. Diseño orientado al aspecto
5.6.2. Orientada a servicios
6. 2. Aspectos clave
6.1. Concurrencia
6.1.1. Descomponer el software en tareas o procesos para tratar con problemas como eficiencia
6.2. Control y manejo de eventos
6.2.1. Organizar información y manejar eventos reactivos y temporales
6.2.1.1. Mecanismos como invocación implícita o call-back (retrollamada)
6.3. Distribución de componentes
6.3.1. Distribuir el software a través del hardware. Comunicación de los componentes.
6.4. Manejo de errores y excepciones y tolerancia a fallos
6.4.1. Prevenir fallos y tratar excepciones
6.5. Interacción y presentación
6.5.1. Organizar la interacción con el usuario y presentar de manera adecuada la información
6.5.1.1. Hacer el programa amigable con el usuario
6.6. Persistencia de datos
7. 3. Estructura y arquitectura de Software
7.1. Estructuras arquitectónicas y puntos de vista
7.1.1. Las "vistas" son facetas parciales de una arquitectura de software que son diseñadas y luego documentadas para después ser reutilizadas
7.1.1.1. Estructura general (Capas)
7.1.1.2. Sistemas distribuidos (cliente - servidor)
7.1.1.3. Sistemas interactivos (modelo - vista - controlador)
7.1.1.4. Sistemas Adaptables (reflexión)
7.2. Patrones de diseño
7.2.1. Solución común para un problema común en un contexto dado
7.2.1.1. Patrón de creación (constructor, fabrica)
7.2.1.2. Patrón estructural (facade)
7.2.1.3. Patrón de comportamiento (iterador)
7.3. Familias de programas y Frameworks
7.3.1. Familias de software y componentes que pueden ser reutilizados o personalizados que además facilitan la construcción del software ya que viene parcialmente completado
8. Analisis de calidad y tecnicas de evaluación
8.1. Criticas sobre el diseño:
8.1.1. Informales o formales
8.2. Analisis estatico:
8.3. Simluación y prototipado
8.4. Técnicas dinámicas para evaluar el diseño
9. Notaciones del diseño
9.1. Estaticas
9.1.1. Describen graficamente (No siempre) los componentes de mayor magnitud y sus interconexiones
9.1.1.1. Lenguajes de descripción de arquitectura
9.1.1.1.1. Textos formales
9.1.1.2. Diagramas de componentes
9.1.1.2.1. Representan relaciones
9.1.1.3. Cartas del colaborador en responsabilidad de clase
9.1.1.3.1. Denotan nombres y responsabilidades
9.1.1.4. Diagrama de despliegue
9.1.1.4.1. Nodos e interrelaciones
9.1.1.5. Entidad relación
9.1.1.5.1. Modelos conceptuales e información almacenada
9.1.1.6. Lenguaje de descripción de interfaces
9.1.1.7. Diagrama de estructura jackson
9.1.1.7.1. Información estructurada
9.1.1.8. Cuadros de estructuras
9.1.1.8.1. Describe llamadas
9.2. Dinamicas
9.2.1. Herramientas graficas con uso fuera del diseño
9.2.1.1. Diagramas de actividad
9.2.1.1.1. Muestran el flujo de las actividades
9.2.1.2. De colaboración
9.2.1.2.1. Interacciones entre grupos de objetos
9.2.1.3. De flujo de información
9.2.1.4. De decision en tablas
9.2.1.4.1. Combinaciones complejas, condiciones y acciones
9.2.1.5. Diagramas de flujo y diagramas de flujo estructurados
9.2.1.5.1. Flujos de control y acciones con asociaciones
9.2.1.6. De secuencia
9.2.1.6.1. Muestra interacciónes de manera que el tiempo es prioridad
9.2.1.7. De transición de estado
9.2.1.7.1. Control de flujo de estado a estado
9.2.1.8. Lenguajes de especificación formal
9.2.1.8.1. Textuales, para explicar procesos matematicas y abstracción
9.2.1.9. Pseudo codigo y lenguajes para el diseño
9.2.1.9.1. Estructura parecida a la programación pero en un detalle de solo diseño