Fundamentos del Diseño de Software
1. Ingeniería del software y diseño del software
El diseño es el primer paso de la fase de desarrollo de cualquier producto o sistema
de ingeniería. Puede definirse como: «El proceso de aplicar distintas técnicas y
principios sin el propósito de definir un dispositivo, proceso o sistema con los
suficientes detalles como para permitir su realización».
El diseño del software requiere de precisión y de creatividad, por parte del diseñador; su propósito es:
Especificar la estructura interna y los detalles de procesamiento de un sistema y proporcionar un ensayo de revisión del porque fueron timadas las decisiones de diseño.
El objetivo del diseñador es producir un modelo o representación de una entidad
que se construirá más adelante. El proceso por el cual se desarrolla el modelo
combina:
• la intuición y los criterios sobre la base de la experiencia de construir entidades similares,
• un conjunto de principios y/o heurísticas que guían la forma en que se desarrolla el modelo,
• un conjunto de criterios que permiten discernir sobre la calidad y
• un proceso de iteración que conduce finalmente a una representación del diseño final.
El objetivo del diseñador es producir un modelo o representación de una entidad
que se continuara mas adelante. El diseño del software es una afirmación de
requisitos del usuario y la realización de estos en la forma de código ejecutable.
Una vez establecidos los requisitos del software, el diseño del software es la
primera de 3 actividades técnicas:
1.Diseño. 2.Codificación. 3.Prueba
Cada actividad transforma la información de forma que finalmente se obtiene un
software para computadora valido.
El diseño del software se asienta en el núcleo técnico del proceso de ingeniería del
software y se aplica independientemente del paradigma de desarrollo utilizado.
Mediante alguna de las metodologías de diseño se realiza el diseño de datos, el
diseño arquitectónico y el diseño procedimental.
Diseño de datos
Transforma el modelo del campo de información, creado durante el análisis, en las
estructuras de datos que se van a requerir para implementar el software.
Diseño arquitectónico:
Define las relaciones entre los principales elementos estructurales del programa.
Diseño procedimental:
Transforma los elementos estructurales en una descripción procedimental del
software. Se genera el código fuente y para integrar y validar el software, se llevan
a cabo las pruebas.
La importancia del diseño del software se puede sentar con una única palabra
-calidad. El diseño es el proceso en el que se asienta la calidad del desarrollo del
software. El diseño produce las representaciones del software de las que puede
evaluarse su calidad. El diseño es la única forma mediante la cual podemos traducir
con precisión los requisitos del cliente en un producto o sistema acabado. El diseño
de software sirve como base de todas las posteriores etapas del desarrollo y de la
fase de mantenimiento. Sin diseño nos arriesgamos a construir un sistema
inestable, un sistema que falle cuando se realicen pequeños cambios; un sistema
que pueda ser difícil de probar; un sistema cuya calidad no pueda ser evaluada
hasta más adelante en el proceso de ingeniería del software, cuando quede poco
tiempo y se haya gastado ya mucho dinero.
Por lo tanto el diseño de software es el proceso de aplicar distintas técnicas y principios con el propósito de definir un sistema con suficiente detalle como para permitir su implementación.
1.2. Alcance del diseño del software
Cubre un rango amplio de actividades en 2 áreas:
Diseño de la arquitectura del sistema:
Este es el proceso durante el cual se produce una especificación completa y verificada del hardware en general.
Diseño detallado del software
: Este ocurre cuando se producen especificaciones verificadas de estructuras de datos. El diseño detallado que se ocupa del
refinamiento de la representación arquitectónica que lleva a una estructura de
datos detallada y a las representaciones algorítmicas del software.
Además del diseño de datos arquitectónico y procedimental, muchas aplicaciones
modernas requieren del diseño de interfaz que establece la disposición y los
mecanismos para la interacción hombre-maquina.
1.3. Diseño y calidad del software
Existen ciertos criterios que son los que evalúan el diseño del software, estos criterios son:
•Un diseño debe mostrar una organización jerárquica.
•En diseño debe ser modular.
•Un diseño debe contener representaciones distintas y separadas de los datos y procedimientos.
• Debe llevar a módulos.
• Debe llevar interfaces que reduzcan la complejidad.
• Debe obtenerse el diseño mediante un modulo reproducible.
1.4. Fundamentos del diseño
Abstracción
: Cuando se considera una solución modular para cualquier problema, pueden formularse muchos niveles de abstracción. En el nivel superior de
abstracción, se establece una solución en términos amplios, usando el lenguaje del
entorno del problema. En los niveles inferiores de abstracción se toma una
orientación más procedimental. La terminología orientada al problema se acompaña con una terminología orientada a la implementación, en un esfuerzo para
establecer una solución. Por último, en el nivel más bajo de abstracción, se
establece la solución, de forma que pueda implementarse directamente.
Conforme nos movemos por diferentes niveles de abstracción, trabajamos para crear bstracciones de datos y de procedimientos. Una abstracción procedimental es una determinada secuencia de instrucciones que tienen una función limitada y específica. Una abstracción de datos es una determinada colección de datos que describen un objeto.
Conforme evoluciona el diseño del software, cada nivel de módulos de la estructura del problema representa un refinamiento en el nivel de abstracción del software.
La abstracción de control es la tercera forma de abstracción que se utiliza en el diseño del software. Al igual que la abstracción procedimental y de datos, la abstracción de control implica un mecanismo de control de programa, sin especificar los detalles internos. Un ejemplo de abstracción de control es el semáforo de sincronización usado para coordinar actividades en un sistema
operativo.
Refinamiento:
El refinamiento sucesivo es una primera estrategia de diseño
descendente propuesta por Niklaus Wirth. La arquitectura de un programa se
desarrolla en niveles sucesivos de refinamiento de los detalles procedimentales. Se
desarrolla una jerarquía descomponiendo una declaración macroscópica de una
función de una f orma sucesiva, hasta que llega a las sentencias del lenguaje de
programación.
El refinamiento es realmente un proceso de elaboración. Comenzamos una
declaración de la función definida a un nivel superior de abstracción. Es decir, la
declaración describe la función o la información conceptualmente, pero no
proporciona información sobre el funcionamiento interno de la función. El
refinamiento hace que el diseñador amplíe la declaración original, dando cada vez
más detalles conforme se produzcan los sucesivos refinamientos.
Modularidad
: El software se divide en componentes con nombres y ubicaciones determinados, que se denominan módulos y que se integran para satisfacer los requisitos del problema.
Se ha dicho que la «modularidad es el atributo individual del software que permite a un programa ser intelectualmente manejable».
Arquitectura del software
: Se refiere a dos carácterísticas importantes del
software: la estructura jerárquica de los componentes procedimentales y la
estructura de datos. La arquitectura se obtiene mediante un proceso de partición,
que relaciona los elementos de una solución de una solución de software con partes
de un problema del mundo real definido implícitamente durante el análisis de los
requisitos.
Jerarquía de control:
La jerarquía de control, también denominada estructura del programa, representa la organización (frecuentemente jerárquica) de los componentes del programa (módulos) e implica una jerarquía de control. No
representa aspectos procedimentales del software, tales como la secuencia de
procesos, la ocurrencia u orden de decisiones o la repetición de operaciones.
Para representar la jerarquía de control se utiliza un diagrama en forma de árbol. La profundidad, y la anchura son una indicación del número de niveles de control y de la amplitud global del control, respectivamente. El grado de salida es una medida del número de módulos que están directamente controlados por otros módulos. El grado de entrada indica cuantos módulos controlan directamente a un módulo dado.
La jerarquía de control también representa dos carácterísticas, sutilmente
diferentes, de la arquitectura del software: la visibilidad y la conectividad. La
visibilidad indica el conjunto de componentes del programa que pueden ser
invocados o utilizados sus datos por un componente dado, incluso cuando se haga
indirectamente. La conectividad indica el conjunto de componentes a los que
directamente se invoca o se utilizan sus datos en un determinado módulo.
Estructuras de datos:
Es una representación de la relación lógica existente entre los elementos individuales de datos. La estructura de datos dicta la organización,
los métodos de acceso, el grado de asociatividad y las alternativas de
procesamiento para la información.
La organización y la complejidad de una estructura de datos tan sólo están
limitadas por el ingenio del diseñador. Sin embargo, hay un número reducido de
estructuras de datos clásicas, que constituyen los bloques con los que se
construyen estructuras de datos más sofisticadas.
Procedimientos del software:
Se centra en los detalles de procesamiento de cada módulo individual. Proporciona una especificación precisa del procesamiento,
incluyendo la secuencia de sucesos, los puntos concretos de decisiones, la
repetición de operaciones e incluso la organización y estructura de los datos.
Ocultamiento de la información: Es un principio que sugiere que los módulos se han de caracterizar por decisiones de diseño que los oculten unos a otros. El ocultamiento implica conseguir una modularidad efectiva
2. El proceso de diseño
El diseño del software es un proceso mediante el que se traducen los requisitos en una representación del software. Inicialmente, la representación describe una visión holística del software. Posteriores refinamientos conducen a una representación de diseño que se acerca mucho al código fuente.
Durante el proceso de diseño tenemos presente los siguiente conceptos:
Métodos:
Es una colección organizada de notaciones, técnicas y procedimientos
formales o semiformales para llevar a cabo una o más de las principales actividades del ciclo de vida. El método identificara las entregas y prescribe la forma o notación en la que serán producidas. Métodos diferentes a menudo comparten notaciones y técnicas comunes.
Clasificación:
Cuando los métodos han sido identificados, el siguiente problema
es la clasificación para esto se emplean criterios, enfoques e investigaciones.
Visibilidad:
Esta referido al sigilo que muchas organizaciones mantienen de su software y por tanto no brindan información acerca de su desarrollo.
Exactitud:
Se refiere al orden que debe regir el software, herramientas técnicas para desarrollar el sistema.
3. Diseño modular efectivo
Un diseño modular reduce la complejidad, facilita los cambios y produce como
resultado una implementación sencilla, permitiendo el desarrollo paralelo de las
diferentes partes de un sistema.
3.1. Tipos de módulos
Para definir módulos en una arquitectura de software, se utiliza la abstracción y el
ocultamiento de la información. Ambos atributos deben ser traducidos a
carácterísticas operativas del módulo, caracterizadas por:
• el historial de incorporación: que se refiere al momento en que se incluye el
módulo en la descripción del software en lenguaje fuente;
• los mecanismos de activación: de referencia o de interrupción;
• el camino de control: describa la forma en que se ejecuta internamente.
3.2. Independencia funcional
El concepto de independencia funcional es una derivación directa del de
modularidad y de los conceptos de abstracción y ocultamiento de información.
La independencia funcional se adquiere desarrollando módulos con una clara
función y una aversión a una excesiva interacción con otros módulos.
La independencia funcional mide el grado en que los módulos dependen unos de otros. Es deseable que cada módulo sea independiente con una función única y poca interacción.
La independencia funcional se mide con dos criterios cualitativos:
•la cohesión: mide la fortaleza funcional relativa de un módulo
•el acoplamiento:
Mide la interdependencia relativa entre los módulos.
3.3. Cohesión
La cohesión es una extensión del concepto de ocultamiento de información. Un
módulo cohesivo ejecuta una tare sencilla de un procedimiento de software y
requiere poca interacción con procedimientos que ejecutan otras partes de un
programa. Es decir, un módulo cohesivo sólo hace (idealmente) una cosa. Mide el número de funciones que hace un módulo.
- Baja cohesión.
- Cohesión coincidente. El módulo hace muchas cosas sin relación.
- Cohesión lógica. El módulo hace muchas cosas relacionadas lógicamente.
- Cohesión temporal. El módulo hace muchas cosas relacionadas por el hecho que deben hacerse al mismo tiempo.
- Cohesión procedimental. El módulo hace varias cosas relacionadas que deben ejecutarse en cierto orden.
- Cohesión de comunicación. El módulo hace varias cosas que trabajan sobre una sola estructura de datos.
- Cohesión funcional. El módulo hace una sola cosa.
9.3.4. Acoplamiento
El acoplamiento es una medida de la interconexión entre los módulos de una
estructura de programa, mide la interconexión entre los módulos.
- Bajo acoplamiento.
- Sin acoplamiento. El módulo es independiente.
- Acoplamiento de datos. El módulo recibe una lista de argumentos de quien lo llama.
- Acoplamiento de control. El módulo recibe una bandera de quien lo llama y se comporta de una manera u otra dependiendo del valor de la bandera.
- Acoplamiento externo. El módulo esta acoplado a un dispositivo de I/O externo. Este tipo de acoplamiento debe limitarse a unos pocos módulos.
- Acoplamiento común. El módulo utiliza variables globales o comunes.
- Acoplamiento de contenido. El módulo usa datos contenidos dentro de los límites de otro módulo.
Recomendaciones para un buen diseño
- Desde el principio reducir el acoplamiento y aumentar la cohesión.
- Módulos pequeños (70 líneas).
- El alcance del efecto de un módulo debe estar dentro del alcance de control de ese módulo.
- Reducir la complejidad de las interfaces y mejorar la consistencia.
- Definir módulos con comportamiento predecible, sin ser muy restrictivos.
- Hacer módulos con una sola entrada y salida.
- Hacer el software basado en las restricciones de diseño y requerimientos de portabilidad
Fundamentos del Diseño de Software
1. Ingeniería del software y diseño del software
El diseño es el primer paso de la fase de desarrollo de cualquier producto o sistema
de ingeniería. Puede definirse como: «El proceso de aplicar distintas técnicas y
principios sin el propósito de definir un dispositivo, proceso o sistema con los
suficientes detalles como para permitir su realización».