Apunte 4 Diseà o de Software
Apunte 4 Diseà o de Software
CONCEPTOS DE DISEÑO
8
E
CONCEPTOS CLAVE l diseño de software agrupa el conjunto de principios, conceptos y prácticas que llevan al
abstracción . . . . . . . . . . . . . 189 desarrollo de un sistema o producto de alta calidad. Los principios de diseño establecen
arquitectura . . . . . . . . . . . . 190 una filosofía general que guía el trabajo de diseño que debe ejecutarse. Deben entenderse
aspectos. . . . . . . . . . . . . . . 194 los conceptos de diseño antes de aplicar la mecánica de éste, y la práctica del diseño en sí lleva
atributos de la calidad . . . . . 187 a la creación de distintas representaciones del software que sirve como guía para la actividad
buen diseño . . . . . . . . . . . . 187 de construcción que siga.
cohesión . . . . . . . . . . . . . . . 193 El diseño es crucial para el éxito de la ingeniería de software. A principios de la década de
diseño de datos. . . . . . . . . . 199 1990, Mitch Kapor, creador de Lotus 1-2-3, publicó en Dr. Dobbs Journal un “manifiesto del di-
diseño del software. . . . . . . 188 seño de software”. Decía lo siguiente:
diseño orientado a objeto . . 195
¿Qué es el diseño? Es donde se está con un pie en dos mundos —el de la tecnología y el de las perso-
división de problemas . . . . . 191 nas y los propósitos humanos— que tratan de unificarse...
independencia funcional . . . . 193 Vitruvio, romano crítico de arquitectura, afirmaba que los edificios bien diseñados eran aquellos
lineamientos de la calidad . . 186 que tenían resistencia, funcionalidad y belleza. Lo mismo se aplica al buen software. Resistencia: un
modularidad . . . . . . . . . . . . 191 programa no debe tener ningún error que impida su funcionamiento. Funcionalidad: un programa debe
ocultamiento de se apropiado para los fines que persigue. Belleza: la experiencia de usar el programa debe ser placen-
información. . . . . . . . . . . . . 192
tera. Éstos son los comienzos de una teoría del diseño de software.
patrones. . . . . . . . . . . . . . . 191
El objetivo del diseño es producir un modelo o representación que tenga resistencia, funciona-
proceso de diseño . . . . . . . . 186
lidad y belleza. Para lograrlo, debe practicarse la diversificación y luego la convergencia. Belady
rediseño . . . . . . . . . . . . . . . 195
[Bel81] afirma que “la diversificación es la adquisición de un repertorio de alternativas, materia
refinamiento . . . . . . . . . . . . 194
prima del diseño: componentes, soluciones con los componentes y conocimiento, todo lo cual
UNA
MIRADA ¿Qué es? El diseño es lo que casi todo inge- arquitectura del sistema o producto. Después se modelan
RÁPIDA
niero quiere hacer. Es el lugar en el que las las interfaces que conectan al software con los usuarios
reglas de la creatividad —los requerimientos de finales, con otros sistemas y dispositivos, y con sus propios
los participantes, las necesidades del negocio y componentes constitutivos. Por último, se diseñan los com-
las consideraciones técnicas— se unen para formular un ponentes del software que se utilizan para construir el sis-
producto o sistema. El diseño crea una representación o tema. Cada una de estas perspectivas representa una
modelo del software, pero, a diferencia del modelo de los acción de diseño distinta, pero todas deben apegarse a un
requerimientos (que se centra en describir los datos que se conjunto básico de conceptos de diseño que guíe el traba-
necesitan, la función y el comportamiento), el modelo de jo de producción de software.
diseño proporciona detalles sobre arquitectura del soft- ¿Cuál es el producto final? El trabajo principal que se
ware, estructuras de datos, interfaces y componentes que produce durante el diseño del software es un modelo de
se necesitan para implementar el sistema. diseño que agrupa las representaciones arquitectónicas,
¿Quién lo hace? Ingenieros de software llevan a cabo interfaces en el nivel de componente y despliegue.
cada una de las tareas del diseño. ¿Cómo me aseguro de que lo hice bien? El modelo
¿Por qué es importante? El diseño permite modelar el de diseño es evaluado por el equipo de software en un
sistema o producto que se va a construir. Este modelo se esfuerzo por determinar si contiene errores, inconsistencias
evalúa respecto de la calidad y su mejora antes de generar u omisiones, si existen mejores alternativas y si es posible
código; después, se efectúan pruebas y se involucra a implementar el modelo dentro de las restricciones, plazo y
muchos usuarios finales. El diseño es el lugar en el que se costo que se hayan establecido.
establece la calidad del software.
¿Cuáles son los pasos? El diseño representa al software
de varias maneras. En primer lugar, debe representarse la
183
184 PAR TE DOS MODELADO
está contenido en catálogos, libros de texto y en la mente”. Una vez que se reúne este conjunto
diversificado de información, deben escogerse aquellos elementos del repertorio que cumplan
los requerimientos definidos por la ingeniería y por el modelo de análisis (capítulos 5 a 7). A
medida que esto ocurre, se evalúan las alternativas, algunas se rechazan, se converge en “una
configuración particular de componentes y, con ello, en la creación del producto final” [Bel81].
La diversificación y la convergencia combinan la intuición y el criterio con base en la expe-
riencia en la construcción de entidades similares, un conjunto de principios heurísticos que
guían la forma en la que evoluciona el modelo, un conjunto de criterios que permiten evaluar la
calidad y un proceso iterativo que finalmente conduce a una representación del diseño defini-
tivo.
El diseño del software cambia continuamente conforme evolucionan los nuevos métodos,
surgen mejores análisis y se obtiene una comprensión más amplia.1 Incluso hoy, la mayor parte
de las metodologías de diseño de software carece de profundidad, flexibilidad y naturaleza
cuantitativa, que normalmente se asocian con las disciplinas de diseño de ingeniería más clási-
cas. No obstante, sí existen métodos para diseñar software, se dispone de criterios para el diseño
con calidad y se aplica la notación del diseño. En este capítulo, se estudian los conceptos y
principios fundamentales aplicables a todo el diseño de software, los elementos del modelo del
diseño y el efecto que tienen los patrones en el proceso de diseño. En los capítulos 9 a 13 se
presentarán varias metodologías de diseño de software, según se aplican en la obtención de
arquitecturas e interfaces en el nivel de componente, así como a enfoques de diseño basados
en patrones y orientados a web.
1 Aquellos lectores interesados en la filosofía del diseño de software pueden consultar el inquietante análisis de
Philippe Kruchen sobre el diseño “posmoderno” [Kru05a].
CAPÍTULO 8 C O N C E PT O S D E D I S E Ñ O 185
los requerimientos definidos por el sistema y las restricciones que afectan la forma en la que se
Cita: implementa la arquitectura [Sha96]. La representación del diseño de la arquitectura —el marco
“Hay dos formas de construir un de un sistema basado en computadora— se obtiene del modelo de los requerimientos.
diseño del software. Una es El diseño de la interfaz describe la forma en la que el software se comunica con los sistemas
hacerlo tan simple que sea que interactúan con él y con los humanos que lo utilizan. Una interfaz implica un flujo de infor-
obvio que no hay deficiencias y mación (por ejemplo, datos o control) y un tipo específico de comportamiento. Entonces, los
la otra es hacerlo tan complica-
modelos de escenarios de uso y de comportamiento dan mucha de la información requerida
do que no haya deficiencias
obvias. El primer método es para diseñar la interfaz.
mucho más difícil.” El diseño en el nivel de componente transforma los elementos estructurales de la arquitec-
tura del software en una descripción de sus componentes en cuanto a procedimiento. La infor-
C. A. R. Hoare
mación obtenida a partir de los modelos basados en clase, flujo y comportamiento sirve como
la base para diseñar los componentes.
Durante el diseño se toman decisiones que en última instancia afectarán al éxito de la cons-
trucción del software y, de igual importancia, a la facilidad con la que puede darse manteni-
miento al software. Pero, ¿por qué es tan importante el diseño?
La importancia del diseño del software se resume en una palabra: calidad. El diseño es el
sitio en el que se introduce calidad en la ingeniería de software. Da representaciones del soft-
ware que pueden evaluarse en su calidad. Es la única manera de traducir con exactitud a un
producto o sistema terminado los requerimientos de los participantes. Es el fundamento de toda
la ingeniería de software y de las actividades que dan el apoyo que sigue. Sin diseño se corre el
riesgo de obtener un sistema inestable, que falle cuando se hagan cambios pequeños, o uno que
sea difícil de someter a prueba, o en el que no sea posible evaluar la calidad hasta que sea de-
masiado tarde en el proceso de software, cuando no queda mucho tiempo y ya se ha gastado
mucho dinero.
186 PAR TE DOS MODELADO
C ASA S EGURA
Diseño versus codificación
La escena: El cubículo de Jamie, cuando el equi- Jamie: ¿Qué?
po se prepara para traducir a diseño los requeri- Ed: Un lenguaje de programación es bueno para representar deta-
mientos. lles tales como estructuras de datos y algoritmos, pero no es tan
Participantes: Jamie, Vinod y Ed, miembros del equipo de inge- bueno para representar la arquitectura o la colaboración entre com-
niería de software para CasaSegura. ponentes… algo así.
La conversación: Vinod: Y una arquitectura complicada arruina al mejor código.
Jamie: Ustedes saben, Doug [el gerente del equipo] está obsesiona- Jamie (piensa unos momentos): Entonces, dicen que no
do con el diseño. Tengo que ser honesto, lo que realmente amo es puede representarse la arquitectura con código... eso no es cierto.
codificar. Denme C++ o Java y soy feliz. Vinod: Claro que es posible implicar la arquitectura con el código,
Ed: No… te gusta diseñar. pero en la mayor parte de lenguajes de programación, es muy difícil
Jamie: No me estás escuchando; codificar es lo mío. lograr un panorama rápido y amplio de la arquitectura con el análi-
sis del código.
Vinod: Creo que Ed quiere decir que en realidad no es codificar lo
que te gusta; te gusta diseñar y expresarlo en código. El código es el Ed: Y eso es lo que queremos hacer antes de empezar a codificar.
lenguaje que usas para representar el diseño. Jamie: Está bien, tal vez diseñar y codificar sean cosas distintas,
Jamie: ¿Y qué tiene de malo? pero aún así me gusta más codificar.
El diseño de software es un proceso iterativo por medio del cual se traducen los requerimientos
en un “plano” para construir el software. Al principio, el plano ilustra una visión holística del
software. Es decir, el diseño se representa en un nivel alto de abstracción, en el que se rastrea
directamente el objetivo específico del sistema y los requerimientos más detallados de datos,
funcionamiento y comportamiento. A medida que tienen lugar las iteraciones del diseño, las
mejoras posteriores conducen a niveles menores de abstracción. Éstos también pueden ras-
trearse hasta los requerimientos, pero la conexión es más sutil.
C. Ferguson
• Debe ser una guía legible y comprensible para quienes generan el código y para los que
lo prueban y dan el apoyo posterior.
• Debe proporcionar el panorama completo del software, y abordar los dominios de los
datos, las funciones y el comportamiento desde el punto de vista de la implementación.
En realidad, cada una de estas características es una meta del proceso de diseño. Pero, ¿cómo
se logran?
rios de calidad del software. En este momento, considere los siguientes lineamientos para el
diseño:
? ¿Cuáles son las 1. Debe tener una arquitectura que 1) se haya creado con el empleo de estilos o patrones
características de un arquitectónicos reconocibles, 2) esté compuesta de componentes con buenas caracte-
buen diseño? rísticas de diseño (éstas se analizan más adelante, en este capítulo), y 3) se implemen-
ten en forma evolutiva,2 de modo que faciliten la implementación y las pruebas.
2. Debe ser modular, es decir, el software debe estar dividido de manera lógica en elemen-
tos o subsistemas.
3. Debe contener distintas representaciones de datos, arquitectura, interfaces y compo-
nentes.
4. Debe conducir a estructuras de datos apropiadas para las clases que se van a imple-
mentar y que surjan de patrones reconocibles de datos.
5. Debe llevar a componentes que tengan características funcionales independientes.
6. Debe conducir a interfaces que reduzcan la complejidad de las conexiones entre los
componentes y el ambiente externo.
7. Debe obtenerse con el empleo de un método repetible motivado por la información ob-
tenida durante el análisis de los requerimientos del software.
8. Debe representarse con una notación que comunique con eficacia su significado.
Estos lineamientos de diseño no se logran por azar. Se consiguen con la aplicación de los prin-
cipios de diseño fundamentales, una metodología sistemática y con revisión.
I NFOR MACIÓN
Evaluación de la calidad del diseño. La revisión técnica
El diseño es importante porque permite que un equipo de revisión planea la reunión, establece la agenda y coordina la junta; el
software evalúe la calidad3 de éste antes de que se imple- secretario toma notas para que no se pierda nada; el productor es la
mente, momento en el que es fácil y barato corregir errores, omisio- persona cuyo trabajo (por ejemplo, el diseño de un componente del
nes o inconsistencias. Pero, ¿cómo se evalúa la calidad durante el software) se revisa. Antes de la reunión, se entrega a cada persona
diseño? El software no puede someterse a prueba porque no hay del equipo una copia del producto del trabajo de diseño y se le pide
nada ejecutable. ¿Qué hacer? que la lea y que busque errores, omisiones o ambigüedades. El obje-
Durante el diseño, la calidad se evalúa por medio de la realiza- tivo al comenzar la reunión es detectar todos los problemas del pro-
ción de una serie de revisiones técnicas (RT). Las RT se estudian con ducto, de modo que puedan corregirse antes de que comience la
detalle en el capítulo 15,4 pero es útil hacer un resumen de dicha téc- implementación. Es común que la RT dure entre 90 minutos y 2 horas.
nica en este momento. Una revisión técnica es una reunión celebrada Al final de ella, el equipo de revisión determina si se requiere de otras
por miembros del equipo de software. Por lo general, participan dos, acciones por parte del productor a fin de que se apruebe el producto
tres o cuatro personas, en función del alcance de la información del como porción del modelo del diseño final.
diseño que se revisará. Cada persona tiene un papel: el líder de la
“La calidad no es algo que se dad, rendimiento y mantenibilidad. Los atributos de calidad FURPS representan el objetivo de
deje arriba de los sujetos y obje- todo diseño de software:
tos como si fuera el remate de
un árbol de navidad.”
2 Para sistemas pequeños, en ocasiones el diseño puede desarrollarse en forma lineal.
Robert Pirsig
3 Los factores de calidad que se estudian en el capítulo 23 ayudan al equipo de revisión cuando evalúa aquélla.
4 Tal vez el lector considere oportuno revisar el capítulo 15 en este momento. Las revisiones técnicas son una parte
crítica del proceso de diseño y un mecanismo importante para lograr su calidad.
188 PAR TE DOS MODELADO
C ONJUNTO DE TAREAS
Conjunto de tareas generales para el diseño
1. Estudiar el modelo del dominio de la informa- Revise las clases de diseño y, si se requiere, modifíquelas.
ción y diseñar las estructuras de datos apropiadas 5. Diseñar cualesquiera interfaces requeridas con sistemas o dis-
para los objetos de datos y sus atributos. positivos externos.
2. Seleccionar un estilo de arquitectura que sea ade- 6. Diseñar la interfaz de usuario.
cuado para el software con el uso del modelo de análisis. Revise los resultados del análisis de tareas.
3. Hacer la partición del modelo de análisis en subsistemas de Especifique la secuencia de acciones con base
diseño y asignar éstos dentro de la arquitectura: en los escenarios de usuario.
Asegúrese de que cada subsistema sea cohesivo Cree un modelo de comportamiento de la interfaz.
en sus funciones. Defina los objetos de la interfaz y los mecanismos de control.
Diseñe interfaces del subsistema. Revise el diseño de la interfaz y, si se requiere, modifíquelo.
Asigne clases de análisis o funciones a cada subsistema. 7. Efectuar el diseño en el nivel de componente.
4. Crear un conjunto de clases de diseño o componentes: Especifique todos los algoritmos en un nivel
Traduzca la descripción de clases de análisis a una clase de abstracción relativamente bajo.
de diseño. Mejore la interfaz de cada componente.
Compare cada clase de diseño con los criterios de diseño; Defina estructuras de datos en el nivel de componente.
considere los aspectos hereditarios. Revise cada componente y corrija todos los errores
Defina métodos y mensajes asociados con cada clase que se detecten.
de diseño. 8. Desarrollar un modelo de despliegue.
Evalúe y seleccione patrones de diseño para una clase
de diseño o subsistema.
• ¿Cuáles son los criterios uniformes que definen la calidad técnica de un diseño de
software?