Tecnología

Programación modular: características, ejemplos, ventajas, aplicaciones


La programación modular es una técnica utilizada para el desarrollo de software, donde se divide el programa en muchos componentes o bloques pequeños autónomos llamados módulos, que son manejables, lógicos y funcionales.

El módulo es un bloque de sentencias que resuelve un problema particular. Cada módulo contiene todo lo necesario para cumplir con su propia funcionalidad y se puede editar o modificar sin que se vea afectado el resto del proyecto.

Esta forma de programar se logra manteniendo una interfaz de módulo permanente que usan los demás componentes del software para así poder acceder a las funciones de cada módulo.

Los módulos imponen límites lógicos entre los componentes, mejorando la capacidad de mantenimiento. Se incorporan a través de interfaces, que están diseñadas de tal manera que se minimiza la dependencia entre los diferentes módulos.

Índice del artículo

Módulo principal y auxiliares

Un módulo principal y varios módulos secundarios son los que conforman la programación modular. Desde el módulo principal se realizan las llamadas a las funciones de los módulos auxiliares.

Estos módulos auxiliares existen como archivos ejecutables separados, que se cargan al ejecutarse el módulo principal. Cada módulo tiene un nombre único asignado en la instrucción PROGRAM.

Los equipos de trabajo pueden desarrollar diferentes módulos por separado sin necesidad de conocer todos los módulos del sistema. Cada una de las aplicaciones modulares tienen asociado un número de versión para proporcionar flexibilidad a los desarrolladores en el mantenimiento del módulo.

Características de la programación modular

Modularidad

Una computadora no necesita una versión desglosada del código para poder ejecutarlo. Son las limitaciones cognitivas humanas las que obligan a escribir código en fragmentos más pequeños.

Un programa puede contener otras funciones y también puede referirse a funciones que están en otros archivos. Estas funciones o módulos son conjuntos de sentencias que sirven para realizar una operación o calcular un valor.

Para poder mantener la simplicidad y legibilidad en programas grandes y complejos, se utiliza una función principal corta en conjunto con otras funciones, en lugar de utilizar una función principal larga.

Al separar un programa en grupos de módulos, cada módulo será más fácil de entender, cumpliendo así con las pautas básicas de la programación estructurada.

Definición de función

Una función consiste en una declaración de su definición seguida de comandos y sentencias. La forma general de una función es:

Nombre_de_función(declaración de parámetros) {

sentencias;

comandos;

retornar expresión;

}

– La declaración de los parámetros representa la información que se está pasando a la función.

– Se definen en las sentencias las variables adicionales utilizadas específicamente por la función.

– Todas las funciones deben incluir una sentencia de retorno.

Alcance de las variables

Las variables que se declaran dentro de la función principal o en funciones definidas por el usuario se denominan variables locales. Estas tienen un valor cuando se ejecuta la función, pero su valor no se retiene al completarse la función.

Las variables que se declaran externamente al programa principal o a las funciones definidas por el usuario se denominan variables globales. Estas variables se pueden tomar desde cualquier función que se encuentre dentro del programa.

Es procedimental

La programación modular es bastante procedimental, ya que se orienta completamente a la escritura de código para funciones, sin tomar en cuenta los datos.

Ejemplos de programación modular

Modularidad en la vida real

Supongamos una casa que tenga electricidad, con varias tomas de corriente en las paredes. Este sistema permite enchufar varios dispositivos eléctricos, por ejemplo, microondas, lavadora, secadora, etc.

Estos dispositivos están diseñados para realizar su tarea específica al enchufarse y encenderse, independientemente de la casa donde se encuentren.

Los módulos de una aplicación deben seguir esta misma filosofía. Esto significa que solo deben realizar su tarea específica sin importar la parte de la aplicación donde se encuentren, o incluso a cuál aplicación estén conectados.

Además, tal como un dispositivo eléctrico puede desenchufarse fácilmente de la toma de corriente, un módulo debe diseñarse de tal forma que pueda eliminarse fácilmente de una aplicación.

Así como eliminar un dispositivo eléctrico no impacta la funcionalidad de los otros dispositivos conectados, eliminar módulos de una aplicación no debería impactar en la funcionalidad de los otros módulos de esa aplicación.

Funciones en Java

En Java los módulos se escriben como funciones independientes. Por ejemplo, se puede tener una función o bloque de código para calcular el promedio general de notas de un estudiante según sus calificaciones en todos los cursos que ha tomado.

La función necesita obtener como entrada el listado de calificaciones para luego retornar el promedio de notas calculado:

Esta función se llama CalcularNotaPromedio. Recibe como entrada una lista de notas, utilizando una matriz de tipo de datos double, y retorna el promedio calculado.

En la función, la variable local sum se inicializa a cero y luego, mediante un ciclo for, se agregan a sum todas las calificaciones. Por último, se divide la suma obtenida entre la cantidad de notas, retornando el valor resultante.

Si la matriz de entrada tuviera las notas 3,5, 3,0 y 4,0, después de sumarlas tendría sum el valor de 10,5 y luego se dividiría entre 3, porque hay tres notas. La función retornaría el valor 3,5.

Ventajas

Programación independiente del proyecto

Varios programadores pueden trabajar en el mismo proyecto si está dividido en módulos. Diferentes programadores pueden diseñar de forma independiente distintos módulos del programa, que es lo requerido para un programa grande y complejo.

Desarrollo eficiente de programas

Los programas se pueden desarrollar más rápidamente, ya que los módulos pequeños e independientes son más fáciles de entender, diseñar y probar que los programas grandes.

El programador puede proveer la entrada necesaria y verificar que el módulo esté correcto examinando su salida.

Uso múltiple de los módulos

El código escrito para un programa a menudo es útil en otros. La programación modular permite que estas secciones se guarden para un uso futuro. Debido a que el código es reubicable, los módulos guardados se pueden vincular a cualquier otro programa que cumpla con los requerimientos de entrada y salida.

Con la programación monolítica, tales secciones de código quedan incrustadas dentro del programa y no están disponibles para ser utilizadas por otros programas.

Facilidad de depuración y modificación

Un módulo es más pequeño que un programa completo, por lo que resulta más fácil probarlo. Cada módulo se puede escribir y probar por separado del resto del programa. Después de que se haya probado un módulo, podrá usarse en un nuevo programa sin tener que probarlo de nuevo.

Cuando se debe modificar un programa, la programación modular simplifica el trabajo. Se pueden vincular módulos nuevos o depurados a un programa existente sin que el resto del programa cambie.

Desventajas

Estructura excesivamente orientada a objetos

Esta programación utiliza interfaces, que es una idea bastante eficaz. Para aprovechar eso, algunos marcos de trabajo traen consigo un conjunto completo de clases intercambiables. Por ejemplo, para manejar la persistencia, podría haber varias clases que implementen una interfaz de persistencia.

Sin embargo, los entornos de desarrollo integrado (IDE) se confunden con esto. Por ejemplo, se podría estar intentando encontrar la fuente de un método, y el IDE no sabrá qué método se desea ver, mostrando así una larga lista de archivos donde exista un método con ese nombre.

Módulos demasiado pequeños

Existe una gran cantidad de módulos que solo contienen una función muy pequeña. Cada módulo requiere un tiempo adicional de análisis y procesamiento, además de su encabezado en el código.

Por tanto, usar muchos módulos pequeños añadirá una sobrecarga al sistema de compilación, aumentando el tamaño del paquete.

Descomponer sin razón

Algunos códigos casi nunca cambian. En esos casos puede que no tenga mucho sentido tratar de hacer que se vea más limpio o con una lógica abstracta, si con solo usarlo ya funciona bien.

Hay códigos que no se ven demasiado bonitos y, sin embargo, no han cambiado mucho en los últimos años. No hay ninguna razón para descomponer en módulos un código que nunca ha cambiado y que ya funciona bien.

Aplicaciones

La programación modular es solo un concepto. Su práctica se puede aplicar en cualquier lenguaje de programación, especialmente los de naturaleza procedimental, que tienen un programa compilado por separado.

Las bibliotecas de componentes construidos a partir de módulos compilados por separado se pueden combinar en un conjunto mediante una herramienta de programación llamada enlazador.

Los nombres de las funciones en los diferentes módulos deben ser únicos para así facilitar su acceso en caso que las funciones utilizadas por el módulo principal se deban exportar.

Entre los lenguajes de programación que admiten el concepto de programación modular se encuentran C, Ada, PL/I, Erlang, Pascal, Algol, COBOL, RPG, Haskell, Python, HyperTalk, IBM/360 Assembler, MATLAB, Ruby, IBM RPG, SmallTalk, Morpho, Java (los paquetes se consideran módulos), Perl, etc.

Lenguaje C

En lenguaje C se puede aplicar programación modular porque permite remediar una dificultad de gran magnitud separando la misma en varios módulos.

Cada uno de estos módulos resuelve un problema en particular, mientras que el programa principal, que es el conjunto de tales procedimientos, resuelve el problema como un todo.

Cada función definida en C es por defecto accesible globalmente. Esto se puede hacer al incluir un archivo de encabezado, donde se define la implementación de la función.

Como ejemplo, se busca declarar un tipo de datos stack y además que la implementación y la estructura de datos quede oculta para los usuarios.

Esto se puede hacer definiendo primero un archivo público llamado stack.h, que contendrá los datos genéricos con el tipo de datos stack y las funciones soportadas por el tipo de datos stack.

stack.h:

extern stack_var1;

extern int stack_do_something(void);

Ahora se puede crear un archivo llamado stack.c que contiene la implementación del tipo de datos stack:

Referencias

  1. CIO Wiki (2019). Modular Programming. Tomado de: cio-wiki.org.
  2. IT Definitions (2020). Modular Programming. Tomado de: defit.org.
  3. New Mexico Tech (2020). Modular programming with functions. Tomado de: ee.nmt.edu.
  4. Christian Maioli (2020). 3 creative techniques for writing modular code. Tech Beacon. Tomado de: techbeacon.com.
  5. Geeks for Geeks (2020). Modular Approach in Programming. Tomado de: geeksforgeeks.org.
  6. Study (2020). Modular Programming: Definition & Application in Java. Tomado de: study.com.