Modularización Uso de sub programas Objetivo • Comprender los conceptos de modularización. Modularidad • La modularidad consiste en fragmentar un programa principal en componentes más pequeños e individuales reduciendo la complejidad en cierto grado. • Cuando un programa se compone de módulos independientes y robustos se dice que es modular, lo cual permite la reutilización y facilita la verificación y depuración de los mismos. • Cada módulo obtenido en el mundo de la solución debe ser independiente y de fácil utilización; un módulo es una estructura que presenta una interfaz (a través de la cual se relaciona con otros módulos) y la implementación (donde se especifican los servicios del módulo Por que usar sub programas (módulos) • Una forma natural de atacar problemas grandes es • dividirlo en sub-problemas que se puedan resolver de • forma "independiente" y luego combinarse. • En programación, esta técnica se refleja en el uso de sub-programas: conjunto de instrucciones que realizan una tarea específica. • En C y lenguajes desendientes los sub-programas se denominan funciones. • Recibe valores de entrada (parámetros) y proporciona • Un valor de salida (valor de retorno). La función se llama o invoca cuando deseamos aplicarla. Por que usar sub programas (módulos) • Reducir la complejidad del programa (“divide y vencerás”). • Eliminar código duplicado. • Limitar los efectos de los cambios (aislar aspectos concretos). • Ocultar detalles de implementación. • Promover la reutilización de código. • Mejorar la legibilidad del código. • Facilitar la portabilidad del código. Reglas de modularización • En primer lugar, se debe saber que cada módulo tiene un significado propio y debe asegurarse que cualquier cambio en la implementación del módulo no afecte a su exterior (la ejecución de otros módulos). Unidades modulares • El lenguaje a utilizar debe proporcionar los mecanismos para desarrollar estructuras modulares con las cuales se puedan describir las diferentes unidades, así el lenguaje y el compilador reconozca cada módulo para manipularlo y realizar las operaciones necesarias. • Por ejemplo en c++ los módulos son archivos compilados separadamente, el nombre de cada archivo puede contener el sufijo .h –para indicar cabecera de archivo- o el sufijo .c –para las implementaciones del modulo-; y las dependencias entre archivos se manejan incluyendo las cabeceras #include en el archivo. Interfaces adecuadas • Cuando se estructura un programa en unidades es conveniente que existan pocas interfaces y que estas sean pequeñas (su tamaño debe ser pequeño con respecto al tamaño de los módulos implicados), también los enlaces entre los diferentes módulos deben ser pocos, permitiendo así que los módulos se enlacen por un numero pequeño de llamadas. Interfaces explicitas • La interfaz se debe declarar y describir explícitamente, el programa debe especificar cuales son los datos y operaciones que un módulo trata de exportar y cuales deben permanecer ocultos del exterior. El programador debe comprender como funciona el programa y el compilador debe poder comprobar si el código que accede al modulo se ha escrito correctamente. Ocultación de información • Todos los módulos deben seguir el principio de ocultación de la información, cada modulo deber ser cerrado, es decir, que debe ser útil y completamente terminado; y al mismo tiempo debe ser abierto, es decir, sujeto a cambios y modificaciones. • En lenguajes de programación clásica la modularización se centra en subprogramas (procedimientos, funciones y subrutinas); en lenguajes orientados a objetos, la modularización o partición del problema se resuelve a través de los tipos abstractos de datos. Crear un archivo de cabecera • Crearemos una librería de funciones. • Primero crearemos el archivo cabecera .h. Éste archivo debe tener todos los prototipos de funciones y definiciones de tipos de datos de nuestra librería. • Luego creamos el archivo del código de la librería. Contiene el código de todas las funciones que fueron escritas en el archivo de cabecera. Archivo de encabezado libreria.h Archivo de código de la librería libreria.c Probando nuestra librería Conclusiones • La modularidad nos permite resolver un problema grande al dividirlo en partes manejables y resolver cada parte por separado. • Los módulos deben ser independientes. • Los módulos se comunican a través de interfaces que definen los parámetros necesarios para su operación.