Busca monografías, tesis y trabajos de investigación

Buscar en Internet 

       Revistas   Cursos   Biografías

rss feeds RSS / /

Modularidad: Un factor vital para la calidad del software

Resumen: La modularidad es la capacidad que tiene un sistema de ser estudiado, visto o entendido como la unión de varias partes que interactúan entre sí y que trabajan para alcanzar un objetivo común, realizando cada una de ellas una tarea necesaria para la consecución de dicho objetivo.

Publicación enviada por Alexander Rodriguez Torres




 


RESUMEN
La modularidad es la capacidad que tiene un sistema de ser estudiado, visto o entendido como la unión de varias partes que interactúan entre sí y que trabajan para alcanzar un objetivo común, realizando cada una de ellas una tarea necesaria para la consecución de dicho objetivo. Cada una de esas partes en que se encuentre dividido el sistema recibe el nombre de módulo. Idealmente un módulo debe poder cumplir las condiciones de caja negra, es decir, ser independiente del resto de los módulos y comunicarse con ellos (con todos o sólo con una parte) a través de unas entradas y salidas bien definidas.

Palabras claves: común, comunicarse, dividido, independiente, interactúan.

INTRODUCCIÓN
Ingeniería de software es la producción de software con calidad. Calidad implica dos tipos de factores: internos y externos. Los factores externos son cualidades que son "detectadas" por los usuarios, por ejemplo: velocidad y facilidad de uso. Los factores internos son cualidades perceptibles por profesionales del área de la computación, por ejemplo: modularidad y legibilidad.
Factores externos:
1. Correctitud: Capacidad para realizar con exactitud las tareas definidas en las especificaciones.
2. Robustez: Capacidad de reaccionar apropiadamente ante condiciones excepcionales.
3. Extensibilidad: Facilidad de adaptar los productos de software a los cambios en la especificación.
4. Reutilización: Capacidad de los elementos de software de servir para la construcción de muchas aplicaciones diferentes.
5. Compatibilidad: Facilidad de combinar unos elementos de software con otros.
6. Eficiencia: Capacidad para exigir la menor cantidad posible de recursos (tiempo de procesador, espacio de memoria, ancho de banda, etc.).
7. Portabilidad: Facilidad de transferir los productos de software a diferentes entornos de hardware y software.
8. Facilidad de uso: Cubre la facilidad de instalación, de operación y de supervisión.
9. Funcionalidad: Conjunto de posibilidades que proporciona un sistema.

El mantenimiento no se menciona como un factor, pero se estima que gran parte del costo del software se dedica al mismo.

A partir de los objetivos de extensibilidad y reutilización, dos de los factores de calidad más importantes, se desprende la necesidad de tener arquitecturas de sistemas flexibles, hechas con componentes autónomos de software. Esto se logra con una adecuada modularidad.

DESARROLLO
¿Por qué descomponer un problema en partes?
Experimentalmente está comprobado que:

1. Un problema complejo cuesta más de resolver que otro más sencillo.
2. La complejidad de un problema global es mayor que la suma de las complejidades de cada una de sus partes por separado.

Según esto, merece la pena el esfuerzo de dividir un problema grande en subproblemas más pequeños. Ahora la cuestión es ¿cómo realizar la descomposición?; realizando un estudio descendente Top-Down que pueda llevar desde la concepción del problema global hasta identificar sus partes. Esta técnica se repite aplicando una estrategia llamada de refinamiento sucesivo, que consiste precisamente en volver a aplicar el estudio descendente Top-Down a cada subproblema una y otra vez hasta obtener subproblemas suficientemente pequeños.

¿Cuándo parar el refinamiento?

Un refinamiento excesivo podría dar lugar a un número tan grande de sub problemas que haría poco práctica la descomposición. Se tendrán en cuenta estos criterios para dejar de descomponer:
1. Cuando no haya tareas bien definidas.
2. Cuando la interfaz de un sub problema sea tan complicada como el propio sub problema

Modularidad
Como se ha explicado un sistema complejo puede dividirse en piezas más simples llamadas módulos, un sistema compuesto de módulos es llamado modular. El principal beneficio de la modularidad es que permite la aplicación del principio de separación de intereses en dos fases: al enfrentar los detalles de cada módulo por separado ignorando detalles de los otros módulos, y al enfrentar las características globales de todos los módulos y sus relaciones para integrarlos en un único sistema coherente. Si estas fases son ejecutadas en ese orden se dice que el sistema es diseñado de abajo hacia arriba (bottom up), en el orden inverso se dice que el sistema es diseñado de arriba hacia abajo (top down).

El principio de modularidad tiene tres 3 objetivos principales: capacidad de descomponer un sistema complejo, capacidad de componerlo a partir de módulos existentes y comprensión del sistema en piezas (o pedazos).

La posibilidad de descomponer un sistema se basa en dividir en subproblemas de forma top down el problema original y luego aplicar el principio a cada subproblema en forma recursiva. Este procedimiento refleja el bien conocido principio de Divide y Vencerás (Divide & Conquer).

La posibilidad de componer un sistema está basada en obtener el sistema final de forma bottom up a partir de componentes elementales. Idealmente en la producción de software se quisiera poder ensamblar nuevas aplicaciones tomando módulos de una biblioteca y combinándolos para formar el producto requerido; estos módulos deberían ser diseñados con el objetivo expreso de ser reusables.

La capacidad de comprender cada parte de un sistema en forma separada ayuda a la modificabilidad del sistema. Debido a la naturaleza evolutiva del software muchas veces se debe volver hacia atrás al trabajo previo y modificarlo. Si el sistema solo puede ser comprendido como un todo las modificaciones serán difíciles de aplicar y el resultado será poco confiable. Cuando se hace necesario reparar el sistema, la modularización apropiada ayuda a restringir la búsqueda de la fuente de error a componentes separados.

Un método de diseño que merezca ser llamado modular, debería satisfacer además de los objetivos anteriores los dos siguientes:
1. Continuidad modular: Se satisface si un pequeño cambio en la especificación de un problema provoca sólo cambios en un solo módulo o en un número pequeño de módulos.
2. Protección modular: Si produce arquitecturas en las cuales el efecto de una situación anormal ocurrida en un módulo durante la ejecución, queda confinado a ese módulo (o se propaga sólo a unos pocos vecinos).
De los objetivos expuestos para asegurar la modularidad, se derivan cinco reglas:
1. Correspondencia directa: Conexión de un sistema de software con los sistemas externos con que está relacionado. La estructura modular obtenida, debe seguir siendo compatible con cualquier otra estructura modular en el dominio del problema.
2. Pocas interfaces de módulos: Cada módulo debe comunicarse con el menor número de módulos posible.
3. Interfaces pequeñas (acoplamiento débil): Si dos módulos se comunican, deben intercambiar la menor información posible.
4. Interfaces explícitas: Siempre que dos módulos A y B se comuniquen, esto debe ser obvio a partir del texto de A, del de B o de ambos.
5. Ocultar información: Mostrar sólo lo necesario.

Para alcanzar estos objetivos los módulos en los que se divida el sistema deben tener alta cohesión y bajo acoplamiento. Un módulo tiene alta cohesión si todos sus elementos están fuertemente relacionados y son agrupados por una razón lógica, esto es todos cooperan para alcanzar un objetivo común que es la función del módulo. La cohesión es una propiedad interna de cada módulo, por el contrario el acoplamiento caracteriza las relaciones de un módulo con otros.

El acoplamiento mide la interdependencia de dos módulos, por ejemplo si el módulo A hace una llamada a una rutina provista por el módulo B o accede a una variable declarada por el módulo B. Si dos módulos dependen fuertemente uno del otro tienen un alto acoplamiento lo que los vuelve difíciles de analizar, comprender, modificar, testear o reusar en forma separada. Idealmente se quiere que los módulos de un sistema tengan bajo acoplamiento.

Una estructura modular con alta cohesión y bajo acoplamiento permite ver los módulos como cajas negras cuando se describe la estructura global del sistema y luego encarar cada módulo por separado cuando se analiza o describe la funcionalidad del módulo.

Jerarquía de módulos

Ésta es una consecuencia directa de la descomposición del problema mediante refinamientos sucesivos, el resultado será un conjunto de módulos estratificados en capas a modo de pirámide donde en la cima habrá un único módulo que representará al programa global y en los niveles inferiores aparecerán los módulos resultantes de las sucesivas divisiones.

Al final, debe obtenerse una estructura piramidal donde los módulos de los niveles superiores se encargan de las tareas de coordinación, lógica de la aplicación y manipulación de los módulos inferiores; estos otros deberán realizar tareas de cálculo, tratamiento y entrada/salida de información.

Algo más sobre módulos [1]

Dentro de una estructura software un modulo puede ser categorizado como:
Modulo secuencial:

Se referencia y ejecuta sin interrupción aparente. Son los más frecuentes.

Modulo incremental (corrutina):
Puede ser interrumpido y restablecido posteriormente. Estos módulos mantienen un puntero de entrada que permite al modulo restablecer el punto de interrupción.

Modulo paralelo (conrutina):

Se ejecuta simultáneamente con otro u otros módulos en entornos de multiprocesadores paralelos.
Las corrutinas y conrutinas requieren unos métodos especiales de diseño desde las primeras etapas del desarrollo.

Características de los módulos:

Contienen instrucciones, lógica de proceso y estructuras de datos.
Pueden ser compilados de forma individual y usados o almacenados como bibliotecas.
Pueden incluirse dentro de un programa.
Se pueden usar invocando un nombre y cero o más parámetros.
Pueden usar a otros módulos.

Existen muchos criterios para definir la modularidad del sistema que van a determinar las estructuras resultantes para un sistema. Entre ellos:

El criterio convencional:

Cada modulo junto con sus subordinados corresponden a un paso del proceso en la secuencia de ejecución.
El criterio de ocultación: Cada modulo oculta a otros módulos una decisión difícil o modificable del diseño.
El criterio de abstracción de datos:
Cada modulo oculta detalles de representación y manipulación de la información.
Niveles de abstracción:
Los módulos y colecciones de módulos proporcionan una jerarquía de servicios más complejos.
Acoplamiento y cohesión:
Estructuración del programa para lograr la máxima cohesión y el mínimo acoplamiento.
Modelización de problemas:
La estructura modular de un problema se ajusta a la estructura del problema a resolver.

CONCLUSIONES
Un correcto diseño modular reduce la complejidad, facilita los cambios y da como resultado una implementación más fácil, posibilitando el desarrollo paralelo de diferentes partes del sistema, sin embargo es muy importante tener en cuenta cuando parar el refinamiento sucesivo para evitar la aparición de módulos que sean incapaces de definir una tarea.

GLOSARIO DE TERMINOS

Acoplamiento: Se define como el grado de interdependencia que hay ente los distintos módulos de un programa; lo deseable es que esta interdependencia sea lo menor posible, es decir, un bajo acoplamiento. Los niveles de acoplamiento, ordenados de menor (más deseable) a mayor (menos deseable) son:
- Acoplamiento normal.- Un módulo llama a otro de un nivel inferior y tan solo intercambian datos (parámetros de entrada/salida).
- Acoplamiento Común.- Dos módulo acceden a un mismo recurso común, típicamente memoria compartida, una variable global o un fichero.
- Acoplamiento de contenido.- Ocurre cuando un módulo necesita acceder a una parte de otro módulo.
- Cohesión: Se define como la medida de fuerza o relación funcional existente entre las sentencias o grupos de sentencias de un mismo módulo. Un módulo coherente ejecutará una única tarea sencilla interactuando muy poco o nada con el resto de módulos del programa. Se persigue que los módulos tengan una alta cohesión.

BIBLIOGRAFÍA
Modularidad.
Disponible en: http://es.wikipedia.org/wiki/Modularidad , Consultado 2 de febrero de 2008.

REFERENCIAS
[1]. Yepes Moyano, Miguel. Apuntes resumen de ingeniería del software, Junio de 2004, Universidad de Córdoba.

AUTOR
Alexander Rodríguez Torres.
Universidad de las Ciencias Informáticas.
Abril de 2008.
atorres@uci.cu



Valora este artículo 5   4   3   2   1

Comparte  Enviar a facebook Facebook   Enviar a menéame Menéame   Digg   Añadir a del.icio.us Delicious   Enviar a Technorati Technorati   Enviar a Twitter Twitter
Artículos Destacados