Elementos de la programación: Modularización

En el apartado anterior, hemos introducido los conceptos fundamentales de la programación estructurada, tal como fue planteada por Dijkstra en su famoso teorema. Ahora veremos algunos conceptos interesantes que, si bien se encuentran en la mayoría de los lenguajes estructurados de la actualidad, son un poco más generales y pueden aplicarse, prácticamente, en cualquier paradigma de programación.

MODULARIZACIÓN

En nuestro trabajo como programadores, nos encontramos a diario con la obligación de resolver problemas. A medida que la tecnología avanza y las necesidades de los usuarios son más exigentes, los problemas que debemos resolver se tornan más complejos. Esto hace que la escritura de los programas sea bastante difícil, y que su complejidad los vuelva inaccesibles. Tarde o temprano, la cantidad de variables y elementos que debemos manejar superará los límites normales de la mente humana.


Una técnica muy común para facilitar la escritura de programas de gran tamaño o que necesiten resolver problemas muy complejos consiste en dividir el problema en problemas más pequeños. De esta manera, cada dificultad será más fácil de entender y, por lo tanto, resultará más sencillo encontrar un algoritmo que lo resuelva. Así, la construcción del programa se reduce a la construcción de pequeñas unidades o subprogramas que se conectan de alguna manera para resolver juntas el problema original. Esta técnica se conoce como Modularización, y  a cada subprograma se lo denomina módulo.

Un programa escrito usando la técnica de modularización se resume en un conjunto de subprogramas que se llaman unos a otros. Cada programa incluye una lista de sentencias (de cualquiera de los tres tipos que estudiamos en el apartado anterior) y, eventualmente, llamadas a otros subprogramas. Cuando hablamos de llamar o invocar a un subprograma, lo que queremos decir es que, desde un subprograma (o incluso desde el programa principal), se deriva la ejecución al subprograma llamado. Por ejemplo, en el siguiente pseudocódigo:

Programa Principal:
1 A()
2 B()
3 Fin.

Subprograma A:
3 Imprimir la palabra “Hola”

Subprograma B:
4 Imprimir la palabra “Mundo”

El programa principal llama o invoca al subprograma A y luego al subprograma B. Y aquí surge uno de los primeros conceptos clave de la modularización: un subprograma o módulo debe ser un algoritmo en sí mismo (de acuerdo con la definición que vimos en el Capítulo 1), es decir, que debe consistir de una secuencia finita de pasos tras la cual finaliza. Entonces, cuando se hace una llamada a un subprograma, éste se ejecuta (o sea, se ejecutan sus sentencias) y, al terminar, el control vuelve al punto desde donde se hizo la invocación. Retornando sobre el ejemplo anterior, concluimos que la secuencia de ejecución será: comienza el programa, se deriva la ejecución al subprograma A, se imprime la palabra Hola, el control vuelve a la línea 2, se deriva el control al subprograma B, se imprime la palabra Mundo, el control vuelve a la línea 3, y el programa termina.