Conceptos básicos de diseño de software

El diseño de software es un proceso para transformar los requisitos del usuario en alguna forma adecuada, lo que ayuda al programador en la codificación e implementación del software.

Para evaluar los requisitos del usuario, se crea un documento SRS (Especificación de requisitos de software), mientras que para la codificación y la implementación, se necesitan requisitos más específicos y detallados en términos de software. La salida de este proceso se puede utilizar directamente en la implementación en lenguajes de programación.

El diseño de software es el primer paso en SDLC (ciclo de vida del diseño de software), que mueve la concentración del dominio del problema al dominio de la solución. Intenta especificar cómo cumplir con los requisitos mencionados en SRS.

Niveles de diseño de software

El diseño de software produce tres niveles de resultados:

  • Architectural Design - El diseño arquitectónico es la versión abstracta más alta del sistema. Identifica el software como un sistema con muchos componentes que interactúan entre sí. En este nivel, los diseñadores tienen la idea del dominio de solución propuesto.
  • High-level Design- El diseño de alto nivel rompe el concepto de diseño arquitectónico de 'entidad única-componente múltiple' en una vista menos abstraída de subsistemas y módulos y describe su interacción entre sí. El diseño de alto nivel se centra en cómo el sistema junto con todos sus componentes se pueden implementar en forma de módulos. Reconoce la estructura modular de cada subsistema y su relación e interacción entre sí.
  • Detailed Design- El diseño detallado se ocupa de la parte de implementación de lo que se ve como un sistema y sus subsistemas en los dos diseños anteriores. Es más detallado sobre los módulos y sus implementaciones. Define la estructura lógica de cada módulo y sus interfaces para comunicarse con otros módulos.

Modularización

La modularización es una técnica para dividir un sistema de software en múltiples módulos discretos e independientes, que se espera que sean capaces de realizar tareas de forma independiente. Estos módulos pueden funcionar como construcciones básicas para todo el software. Los diseñadores tienden a diseñar módulos de manera que se puedan ejecutar y / o compilar por separado e independientemente.

El diseño modular sigue involuntariamente las reglas de la estrategia de resolución de problemas "divide y vencerás", esto se debe a que hay muchos otros beneficios asociados con el diseño modular de un software.

Ventaja de la modularización:

  • Los componentes más pequeños son más fáciles de mantener
  • El programa se puede dividir en función de los aspectos funcionales
  • El nivel de abstracción deseado se puede incorporar al programa.
  • Los componentes con alta cohesión se pueden volver a utilizar
  • La ejecución concurrente puede ser posible
  • Deseado desde el aspecto de seguridad

Concurrencia

En el pasado, todo el software debe ejecutarse de forma secuencial. Por ejecución secuencial queremos decir que la instrucción codificada se ejecutará una tras otra, lo que implica que solo se activa una parte del programa en un momento dado. Digamos que un software tiene varios módulos, entonces solo uno de todos los módulos se puede encontrar activo en cualquier momento de ejecución.

En el diseño de software, la concurrencia se implementa dividiendo el software en múltiples unidades de ejecución independientes, como módulos, y ejecutándolos en paralelo. En otras palabras, la concurrencia proporciona la capacidad al software para ejecutar más de una parte del código en paralelo entre sí.

Es necesario que los programadores y diseñadores reconozcan esos módulos, que se pueden realizar en ejecución paralela.

Ejemplo

La función de revisión ortográfica del procesador de texto es un módulo de software que se ejecuta junto con el procesador de texto.

Acoplamiento y cohesión

Cuando un programa de software está modularizado, sus tareas se dividen en varios módulos en función de algunas características. Como sabemos, los módulos son un conjunto de instrucciones que se combinan para lograr algunas tareas. Sin embargo, se consideran como una sola entidad, pero pueden referirse entre sí para trabajar juntos. Existen medidas mediante las cuales se puede medir la calidad de un diseño de módulos y su interacción entre ellos. Estas medidas se denominan acoplamiento y cohesión.

Cohesión

La cohesión es una medida que define el grado de intradependencia dentro de los elementos de un módulo. Cuanto mayor sea la cohesión, mejor será el diseño del programa.

Hay siete tipos de cohesión, a saber:

  • Co-incidental cohesion -Es una cohesión aleatoria y no planificada, que podría ser el resultado de dividir el programa en módulos más pequeños en aras de la modularización. Debido a que no está planificado, puede causar confusión a los programadores y, por lo general, no se acepta.
  • Logical cohesion - Cuando los elementos categorizados lógicamente se agrupan en un módulo, se denomina cohesión lógica.
  • Temporal Cohesion - Cuando los elementos del módulo se organizan de tal manera que se procesan en un momento similar, se denomina cohesión temporal.
  • Procedural cohesion - Cuando se agrupan elementos del módulo, que se ejecutan secuencialmente para realizar una tarea, se denomina cohesión procedimental.
  • Communicational cohesion - Cuando se agrupan elementos del módulo, que se ejecutan secuencialmente y trabajan sobre los mismos datos (información), se denomina cohesión comunicacional.
  • Sequential cohesion - Cuando los elementos del módulo se agrupan porque la salida de un elemento sirve como entrada a otro y así sucesivamente, se denomina cohesión secuencial.
  • Functional cohesion - Se considera que es el grado más alto de cohesión y es muy esperado. Los elementos del módulo en cohesión funcional se agrupan porque todos contribuyen a una única función bien definida. También se puede reutilizar.

Acoplamiento

El acoplamiento es una medida que define el nivel de interdependencia entre los módulos de un programa. Indica a qué nivel los módulos interfieren e interactúan entre sí. Cuanto menor sea el acoplamiento, mejor será el programa.

Hay cinco niveles de acoplamiento, a saber:

  • Content coupling - Cuando un módulo puede acceder directamente o modificar o hacer referencia al contenido de otro módulo, se denomina acoplamiento a nivel de contenido.
  • Common coupling- Cuando varios módulos tienen acceso de lectura y escritura a algunos datos globales, se denomina acoplamiento común o global.
  • Control coupling- Dos módulos se denominan acoplados por control si uno de ellos decide la función del otro módulo o cambia su flujo de ejecución.
  • Stamp coupling- Cuando varios módulos comparten una estructura de datos común y trabajan en diferentes partes de ella, se denomina acoplamiento de sellos.
  • Data coupling- El acoplamiento de datos es cuando dos módulos interactúan entre sí mediante el paso de datos (como parámetro). Si un módulo pasa la estructura de datos como parámetro, entonces el módulo receptor debe usar todos sus componentes.

Idealmente, ningún acoplamiento se considera el mejor.

Verificación de diseño

El resultado del proceso de diseño de software es la documentación de diseño, pseudocódigos, diagramas lógicos detallados, diagramas de proceso y una descripción detallada de todos los requisitos funcionales o no funcionales.

La siguiente fase, que es la implementación del software, depende de todos los resultados mencionados anteriormente.

Entonces es necesario verificar la salida antes de pasar a la siguiente fase. Cuanto antes se detecte un error, mejor será o puede que no se detecte hasta que se pruebe el producto. Si los resultados de la fase de diseño están en forma de notación formal, entonces se deben usar sus herramientas asociadas para la verificación; de lo contrario, se puede usar una revisión completa del diseño para la verificación y validación.

Mediante un enfoque de verificación estructurado, los revisores pueden detectar defectos que podrían deberse a pasar por alto algunas condiciones. Una buena revisión del diseño es importante para un buen diseño, precisión y calidad del software.