Diseño de soluciones de software: principios, notaciones y estrategias recomendadas por IEEE

Clasificado en Informática

Escrito el en español con un tamaño de 9,11 KB

Diseño de soluciones: definiciones y directrices propuestas por la IEEE para el diseño de software

Fundamentos del diseño de software

La etapa de diseño en el proceso de construcción de software está organizada en dos fases principales:

  • Diseño arquitectónico: describe cómo el software se descompone y organiza en componentes; define la arquitectura del software.
  • Diseño detallado: describe el comportamiento específico de estos componentes.

Principios de diseño

Abstracción: enfocarse en un objeto para un propósito particular, con el fin de obtener la información relevante sin considerar el resto de la información.

Acoplamiento y cohesión

Acoplamiento: se define como una medida de la interdependencia entre los módulos de un programa computacional.
Cohesión: es una medida que define cuán fuertemente asociados se encuentran los elementos de un módulo.

Descomposición y modularización

Un proyecto de software grande puede ser dividido en componentes más pequeños, con interfaces bien definidas que describen la interacción entre los componentes. La forma de hacerlo es colocar diferentes funcionalidades y responsabilidades en componentes distintos.

Encapsulación u ocultamiento de información

Consiste en agrupar y empaquetar los detalles internos de una abstracción y hacerlos inaccesibles directamente a entidades externas; para su acceso se deben usar interfaces definidas.

Separación de la interfaz y de la implementación

Consiste en definir un componente mediante la especificación de una interfaz pública (para el cliente) y otra que contiene los detalles de su implementación.

Suficiencia, integridad y primitivismo

El logro de la suficiencia e integridad significa asegurar que un componente de software capture únicamente todas las características importantes de una abstracción. Con respecto a la primitividad, el diseño debe basarse en patrones que sean fáciles de implementar.

Aspectos clave

  • Concurrencia: cómo descomponer el software en procesos, tareas e hilos y tratar temas relacionados con la eficiencia, la atomicidad, la sincronización y la planificación.
  • Control y manejo de eventos: cómo organizar los datos y controlar el flujo; cómo manejar eventos reactivos y temporales a través de diversos mecanismos, tales como invocación implícita y callback.
  • Distribución de los componentes: cómo distribuir el software a través del hardware.
  • Manejo de errores: excepciones y tolerancia a fallos; cómo prevenir y tolerar fallos y cómo hacer frente a condiciones excepcionales.
  • Interacción y presentación: cómo estructurar y organizar las interacciones con los usuarios y la presentación de la información.
  • Persistencia de datos: cómo manejar los datos a través del tiempo.

Aspectos a considerar

Captura de errores y recuperación: try-catch en Java, C#, JavaScript, etc.

Notaciones del diseño de software

Muchas notaciones y lenguajes existen para representar los artefactos del diseño de software. Algunos se utilizan principalmente para describir una organización estructural; otros, para representar el comportamiento del software.

Descripción estructural (vista estática)

Lenguajes de descripción de arquitecturas (ADLs): son textuales, tienden a ser formales y se usan para describir una arquitectura de software en términos de componentes y conectores.

  • Diagramas de clases y de objetos: se utilizan para representar un conjunto de clases (y objetos) y sus interrelaciones.
  • Diagramas de componentes: se usan para representar un conjunto de componentes.
  • Tarjetas de Clase, Responsabilidad y Colaboración (CRCs): se usan para indicar los nombres de los componentes (clase), sus responsabilidades y los nombres de los componentes que colaboran.
  • Diagramas de despliegue: se utilizan para representar un conjunto de nodos (físicos) y sus interrelaciones, y, por tanto, para modelar los aspectos físicos de un sistema.
  • Diagramas de entidad-relación (ERDs): se utilizan para representar los modelos conceptuales de los datos almacenados en sistemas de información.
  • Lenguajes de descripción de interfaz (IDLs): lenguajes que se utilizan para definir las interfaces.
  • Diagramas estructurales de Jackson: se utilizan para describir las estructuras de datos en términos de secuencia, selección e iteración.
  • Diagramas de estructura: se utilizan para describir la estructura de llamadas de los programas.

Descripción del comportamiento

  • Diagramas de actividad: se utilizan para mostrar el flujo de control de una actividad.
  • Diagramas de colaboración: muestran el resultado de las interacciones entre un grupo de objetos, sus vínculos y los mensajes intercambiados en estos enlaces.
  • Diagramas de flujo de datos (DFDs): se utilizan para mostrar el flujo de datos entre un conjunto de procesos.
  • Diagramas y tablas de decisión: se utilizan para representar combinaciones complejas de condiciones y acciones.
  • Diagramas de flujo y diagramas de flujo estructurado: se utilizan para representar el flujo de control y las acciones asociadas.
  • Diagramas de secuencia: se utilizan para mostrar las interacciones entre un grupo de objetos, con énfasis en el orden temporal de mensajes.
  • Diagramas de estados y transición de estados: se utilizan para mostrar el flujo de control de estado a estado en una máquina de estados.
  • Lenguajes de especificación formal: lenguajes textuales que utilizan conceptos matemáticos básicos (por ejemplo, lógica, conjuntos y secuencias) de forma rigurosa y abstracta. Definen las interfaces, componentes y comportamiento del software, a menudo en términos de precondiciones y poscondiciones.
  • Pseudo-código y lenguajes de programación de diseño (PDLs): lenguajes estructurados, similares a los lenguajes de programación, utilizados para describir el comportamiento de un procedimiento o método generalmente en la fase de proyecto.

Estrategias y métodos de diseño del software

Las estrategias consisten en descripciones generales de un proceso y directrices, que dan origen a métodos que pueden ser usados como referencia por los ingenieros de software al momento de desarrollar un sistema de información.

Estrategias generales

Algunas estrategias generales útiles en el proceso de diseño son:

  • Dividir para obtener mejores resultados.
  • Realizar un refinamiento paso a paso.
  • Estrategias de arriba hacia abajo versus de abajo hacia arriba.
  • Extracción de datos y ocultamiento de información.
  • Uso de heurística.
  • Uso de patrones y lenguajes de patrones.
  • Enfoque iterativo e incremental.

Diseños específicos

Diseño orientado a funciones (diseño estructurado): método clásico donde la descomposición se realiza identificando las principales funciones del software y elaborando y refinando el diseño de arriba hacia abajo.

Diseño orientado a objetos: (sustantivo = objeto; verbo = método; adjetivo = atributo). En el diseño orientado a objetos, la herencia y el polimorfismo desempeñan un papel clave.

Diseño centrado en datos: se centra en la estructura de datos; el ingeniero describe primero los datos de entrada y salida estructurados (por ejemplo, usando diagramas estructurales de Jackson) y luego desarrolla la estructura de control del programa en base a estos diagramas.

Diseño basado en componentes (CDB): un componente de software es una unidad independiente que tiene interfaces y dependencias bien definidas, y que puede componerse y desplegarse de forma independiente. El diseño basado en componentes aborda temas relacionados con la entrega, el desarrollo y la integración de dichos componentes para mejorar la reutilización.

Tipos de diseño

Diseño a la medida: se fundamenta en los resultados de los procesos de análisis de requisitos que se han efectuado sobre necesidades específicas de los clientes que no pueden ser cubiertas por un software genérico. También se aplica cuando los clientes buscan una solución novedosa con requisitos propios.

Diseño genérico: utiliza los resultados de diseños anteriores que, por sus características, pueden ajustarse a un desarrollo determinado; por ejemplo, los patrones de diseño, que pueden ser utilizados en diversos proyectos informáticos cada vez que se requiera.

Entradas relacionadas: