Fundamentos de la Arquitectura de Software

No podemos hablar de arquitectura del software sin relacionarnos con la ingeniería de sistemas, generalmente llamada “Ingeniería de Software”, ya que el diseño del software se encuentra en el núcleo técnico de la Ingeniería de sistemas cuyo objetivo es producir software de alta calidad. En la ingeniería de sistemas se ve al diseño como el “plano del software” y se destaca que las áreas en las que se aplica son: los datos, la arquitectura, las interfaces y los componentes.

Mientras que el diseño de datos transforma el dominio de información en estructuras de datos, el diseño arquitectónico define la relación entre elementos estructurales del software.

Se le denomina “diseño de interfaz” a la manera en que el software se comunicará dentro de sí mismo, con otros sistemas y con las personas.

El diseño de los componentes transforma elementos estructurales en descripciones procedimentales.

El proceso de diseño es un proceso interativo que está basado en principios fundamentales para lograr su eficacia. Inicialmente se presenta en un nivel de abstracción alto y cada vez se refina más. La calidad de su evolución se evalúa mediante Revisiones Técnicas Formales (RTF).

Dentro de las directrices para la calidad del diseño se menciona que éste deberá presentar una estructura arquitectónica que sea creada con patrones de diseño reconocibles; que esté formada por componentes de calidad y funcionalmente independientes; que contenga interfaces que faciliten las conexiones y que se pueda implementar evolutivamente.

Otra de las directrices indica que el diseño debe ser modular; además de que debe contener diferentes representaciones y derivarse del análisis de forma controlada.

Profundizando un poco en el proceso de diseño, explicaremos a qué se refieren los principios de: abstracción, refinación, ocultamiento de información y modulación que son básicos para lograr un buen diseño.

Abstracción: Es una descripción simplificada o especificación que enfatiza algunos de los detalles o propiedades del sistema, mientras suprime otros. Se refiere a los niveles de resolución de problema, los cuales pueden ser altos si se especifica en lenguaje del entorno del problema; o bajo nivel de abstracción (o inferior) si tiene una orientación procedimental. La abstracción puede ser de datos, procedimientos y control.

La abstracción es procedimental cuando se trata de una secuencia nombrada de instrucciones que tiene una función específica y limitada.

La abstracción es de datos cuando se hace referencia a una colección nombrada de datos que describe un objeto de datos.

La abstracción es de control si explicita el mecanismo de control de programa sin especificar los datos internos.

Refinamiento: Es la base del diseño. Es un proceso de elaboración que comienza con un nivel de abstracción alto y va descendiendo sucesivamente de nivel de abstracción hasta llegar a un nivel bajo. Durante el proceso de refinamiento se van obteniendo detalles tanto de procedimientos como de datos obteniendo mejores soluciones más fáciles de implementar. El refinamiento tiene como objetivo encontrar detalles de bajo nivel que podrían ser difíciles de plasmar.

El refinamiento hace que el diseñador trabaje sobre la sentencia original proporcionando cada vez más detalles a medida que van teniendo lugar sucesivamente todos y cada uno de los refinamientos.

Modularidad: Un método de diseño software se dice que es modular si ayuda a los diseñadores a construir sistemas software formados por elementos autónomos y organizados en arquitecturas sencillas. Se trata de dividir el software en componentes nombrados y abordados por separado llamados “módulos”, que se integran para resolver los requisitos del problema.

La modularidad es el atributo de software que permite que un programa sea manejable intelectualmente, por lo que se deduce que los módulos son los componentes básicos de todo sistema y tienden a satisfacer a uno o más requerimientos.

Un software monolítico (programa grande formado por un solo módulo) no puede ser entendido fácilmente por el lector.

Aunque la modularidad sea benéfica para un sistema, tampoco debe exagerarse en el número de módulos, estas guías ayudarán a hacer más efectiva la modularidad:

– diseñar pocas interfaces (en un sistema formado por N módulos,
– el número de conexiones entre ellos debe acercarse al número mínimo que al máximo);
– procurar interfaces estrechas (si dos módulos se comunican deben de intercambiar el mínimo de información posible);
– lograr interfaces explícitas (la comunicación entre dos módulos debe poder deducirse a partir del texto de ambos);
– cumplir el principio de ocultamiento de información: Los módulos de un sistema deben diseñarse de modo que la información contenida en ellos sea inaccesible a todos aquellos módulos que no necesiten tal información.

Uno de los conceptos fundamentales del diseño lo marca la arquitectura del software, que -como ya lo habíamos mencionado- hace referencia a la estructura global del software y a las formas en que ésta proporciona la integridad conceptual de un sistema, dicha estructura es “jerárquica” en forma de módulos.

La arquitectura de software debe ayudar a definir como interactúan los componentes de software entre sí y las estructuras de los datos.
La jerarquía de control representa dos características, visibilidad y conectividad.

La visibilidad es el conjunto de componentes de un programa que pueden ser invocados o utilizados sus datos por un componente aun de manera directa. La conectividad indica el conjunto de componentes que son accedidos de manera directa por otros componentes.

La partición estructural de una arquitectura de software puede ser horizontal (de acuerdo a las áreas de diseño) datos, procesos y control o bien vertical definiendo una jerarquía de módulos (los módulos se programan de tal forma que los datos no estén accesibles por otros módulos).

Se dice que un diseño modular es efectivo cuando éste ayuda a reducir la complejidad, facilita los cambios y ayuda a producir soluciones más sencillas.

Los tres tipos de módulos existentes son: secuencial, incremental y paralelo.

Por todo lo anteriormente expuesto, se llega a la conclusión de que la “independencia funcional” del diseño se adquiere cuando se desarrollan los conceptos de modularidad, abstracción y ocultamiento de información.

La independencia funcional se mide con base en dos criterios: cohesión y acoplamiento.

Cohesión: es una extensión del principio de ocultación de información, es deseable tener una alta cohesión. Esta se obtiene cuando el contenido de un módulo está diseñado para realizar una tarea sencilla sin depender de otros módulos; o bien que un módulo lleve a cabo sólo una función de procesamiento.

El acoplamiento se refiere a la fuerza de la relación entre módulos de un sistema. En general, los buenos diseñadores buscan desarrollar la estructura de un sistema de tal forma que un módulo tenga poca dependencia de cualquier otro módulo. Es necesario tener un bajo acoplamiento.

El acoplamiento se mide en las relaciones que guardan los módulos con sus interfaces de entrada y salida. Hay tres tipos de acoplamiento: común, de datos y control.

Fuente: Informática I de la facultad de contaduría y administración, UNAM.