Estrategias de diseño de software
El diseño de software es un proceso para conceptualizar los requisitos del software en la implementación del software. El diseño de software toma los requisitos del usuario como desafíos y trata de encontrar una solución óptima. Mientras se conceptualiza el software, se traza un plan para encontrar el mejor diseño posible para implementar la solución deseada.
Existen múltiples variantes de diseño de software. Estudiémoslos brevemente:
Diseño estructurado
El diseño estructurado es una conceptualización del problema en varios elementos de solución bien organizados. Se trata básicamente del diseño de la solución. El beneficio del diseño estructurado es que brinda una mejor comprensión de cómo se está resolviendo el problema. El diseño estructurado también facilita que el diseñador se concentre en el problema con mayor precisión.
El diseño estructurado se basa principalmente en la estrategia de "divide y vencerás" en la que un problema se divide en varios problemas pequeños y cada problema pequeño se resuelve individualmente hasta que se resuelve todo el problema.
Los pequeños problemas se resuelven mediante módulos de solución. El diseño estructurado enfatiza que estos módulos estén bien organizados para lograr una solución precisa.
Estos módulos están organizados en jerarquía. Se comunican entre sí. Un buen diseño estructurado siempre sigue algunas reglas para la comunicación entre múltiples módulos, a saber:
Cohesion - agrupación de todos los elementos relacionados funcionalmente.
Coupling - comunicación entre diferentes módulos.
Un buen diseño estructurado tiene una alta cohesión y bajos arreglos de acoplamiento.
Diseño orientado a funciones
En el diseño orientado a funciones, el sistema se compone de muchos subsistemas más pequeños conocidos como funciones. Estas funciones son capaces de realizar tareas importantes en el sistema. El sistema se considera una vista superior de todas las funciones.
El diseño orientado a funciones hereda algunas propiedades del diseño estructurado donde se utiliza la metodología de dividir y conquistar.
Este mecanismo de diseño divide todo el sistema en funciones más pequeñas, lo que proporciona medios de abstracción ocultando la información y su funcionamiento. Estos módulos funcionales pueden compartir información entre sí mediante el paso de información y el uso de información disponible globalmente.
Otra característica de las funciones es que cuando un programa llama a una función, la función cambia el estado del programa, lo que a veces no es aceptable para otros módulos. El diseño orientado a funciones funciona bien donde el estado del sistema no importa y el programa / funciones trabajan en la entrada en lugar de en un estado.
Proceso de diseño
- Todo el sistema se ve como cómo fluyen los datos en el sistema por medio de un diagrama de flujo de datos.
- DFD describe cómo las funciones cambian los datos y el estado de todo el sistema.
- Todo el sistema se divide lógicamente en unidades más pequeñas conocidas como funciones sobre la base de su funcionamiento en el sistema.
- Luego, cada función se describe en su totalidad.
Diseño orientado a objetos
El diseño orientado a objetos trabaja alrededor de las entidades y sus características en lugar de funciones involucradas en el sistema de software. Esta estrategia de diseño se centra en las entidades y sus características. Todo el concepto de solución de software gira en torno a las entidades comprometidas.
Veamos los conceptos importantes del Diseño Orientado a Objetos:
- Objects - Todas las entidades involucradas en el diseño de la solución se conocen como objetos. Por ejemplo, la persona, los bancos, la empresa y los clientes se tratan como objetos. Cada entidad tiene algunos atributos asociados y tiene algunos métodos para actuar sobre los atributos.
Classes - Una clase es una descripción generalizada de un objeto. Un objeto es una instancia de una clase. La clase define todos los atributos que puede tener un objeto y los métodos que definen la funcionalidad del objeto.
En el diseño de la solución, los atributos se almacenan como variables y las funcionalidades se definen mediante métodos o procedimientos.
- Encapsulation - En OOD, los atributos (variables de datos) y los métodos (operación sobre los datos) que se agrupan juntos se denomina encapsulación. La encapsulación no solo agrupa la información importante de un objeto, sino que también restringe el acceso a los datos y métodos del mundo exterior. A esto se le llama ocultación de información.
- Inheritance - OOD permite que clases similares se apilen de manera jerárquica donde las subclases inferiores pueden importar, implementar y reutilizar variables y métodos permitidos de sus superclases inmediatas. Esta propiedad de OOD se conoce como herencia. Esto facilita la definición de clases específicas y la creación de clases generalizadas a partir de clases específicas.
- Polymorphism - Los lenguajes OOD proporcionan un mecanismo en el que se puede asignar el mismo nombre a métodos que realizan tareas similares pero varían en argumentos. Esto se llama polimorfismo, que permite que una sola interfaz realice tareas para diferentes tipos. Dependiendo de cómo se invoque la función, se ejecuta la porción respectiva del código.
Proceso de diseño
El proceso de diseño de software puede percibirse como una serie de pasos bien definidos. Aunque varía según el enfoque de diseño (orientado a funciones u orientado a objetos, puede tener los siguientes pasos involucrados:
- El diseño de una solución se crea a partir del requisito o del sistema utilizado anteriormente y / o del diagrama de secuencia del sistema.
- Los objetos se identifican y agrupan en clases en nombre de la similitud en las características de los atributos.
- Se define la jerarquía de clases y la relación entre ellas.
- Se define el marco de aplicación.
Enfoques de diseño de software
Aquí hay dos enfoques genéricos para el diseño de software:
Diseño de arriba hacia abajo
Sabemos que un sistema se compone de más de un subsistema y contiene varios componentes. Además, estos subsistemas y componentes pueden tener su propio conjunto de subsistemas y componentes y crean una estructura jerárquica en el sistema.
El diseño de arriba hacia abajo toma todo el sistema de software como una entidad y luego lo descompone para lograr más de un subsistema o componente en función de algunas características. Luego, cada subsistema o componente se trata como un sistema y se descompone aún más. Este proceso continúa ejecutándose hasta que se alcanza el nivel más bajo del sistema en la jerarquía de arriba hacia abajo.
El diseño de arriba hacia abajo comienza con un modelo generalizado de sistema y continúa definiendo la parte más específica del mismo. Cuando todos los componentes están compuestos, todo el sistema entra en existencia.
El diseño de arriba hacia abajo es más adecuado cuando la solución de software debe diseñarse desde cero y se desconocen detalles específicos.
Diseño de abajo hacia arriba
El modelo de diseño de abajo hacia arriba comienza con los componentes más específicos y básicos. Continúa componiendo componentes de nivel superior utilizando componentes de nivel básico o inferior. Sigue creando componentes de nivel superior hasta que el sistema deseado no evoluciona como un solo componente. Con cada nivel superior, aumenta la cantidad de abstracción.
La estrategia de abajo hacia arriba es más adecuada cuando se necesita crear un sistema a partir de algún sistema existente, donde las primitivas básicas se pueden usar en el sistema más nuevo.
Ambos enfoques, de arriba hacia abajo y de abajo hacia arriba, no son prácticos individualmente. En cambio, se utiliza una buena combinación de ambos.