¿Qué es la programación modular?

La programación modular, de forma muy resumida, es una forma o técnica de programar, que consiste sencillamente en realizar divisiones de un programa grande en diversos módulos o subprogramas.
Espacio publicitario
¿Qué es un módulo en Python?
En Python, un módulo es un archivo de código fuente Python, con la extensión .py. No obstante, también puede escribirse en otros lenguajes de programación.
Para crear un módulo, simplemente crea un archivo de texto con la extensión .py y escribe el código que quieras incluir en el módulo.
Después, con las importaciones, podrás enlazar todos los módulos de tus programas.
Al enlazar (importar) un módulo, recibes acceso a su código, como si lo tuvieras escrito en la misma hoja de código.
Módulo es module en inglés.
¿Qué tipos de módulos hay en Python?
En Python, tenemos tres grandes tipos de módulos, los escritos en lenguaje Python, los integrados en el propio lenguaje Python y los que contienen código de otros lenguajes de programación.
Módulos propios y de terceros escritos en código Python
Este tipo de módulos son los que escribimos por nuestra cuenta o lo hacen terceras personas; están escritos con código Python. Cualquiera que sepa programar en Python, puede escribir uno.
Módulos integrados
También tenemos módulos que vienen integrados en Python
(built-in modules), como builtins
, que
nos permiten usar elementos directamente en el código, sin
importar nada, como por ejemplo, la función
len()
:
cadena = "Hola, mundo!"
longitud = len(cadena)
print(longitud)
Módulos escritos en otros lenguajes de programación
Si necesitas crear módulos con un rendimiento superior, puedes utilizar un lenguaje de programación más cercano al hardware, por ejemplo C o C++.
Un ejemplo de esto, es NumPy, que cuenta con elementos en cierto modo parecidos a las listas de Python, llamados arrays, que ofrecen un buen rendimiento en comparación.
Entonces, si necesitamos procesar una cantidad enorme de datos, u otras tareas que requieran de mayor rendimiento, podemos optar por utilizar módulos de este tipo.
La biblioteca NumPy está escrita en gran parte con C y C++. Por eso tiene más rendimiento frente a ciertos elementos como son las listas de Python.
Espacio publicitario
Características de la programación modular
Con la programación modular facilitamos la comprensión del código, el mantenimiento, la sencillez, los temas de ámbito, la depuración, la reutilización de código...
¿Te imaginas todo el código de Python y sus módulos integrados en un solo archivo? Traería muchos problemas y sería poco óptimo. Por no hablar del tema del espacio de nombres o namespace, el cual trataré en este curso.
Depuración del código
Los módulos de un programa complejo, podrán ser probados de manera individual. Si ocurre un fallo en uno de ellos, solo tendremos que solucionarlo, y no tiene por qué dejar de funcionar todo el programa. Solo esa parte.
Depurar errores se hace más sencillo, al tener cada cosa en su sitio. Si falla una cosa de un módulo concreto, podrás reducir la búsqueda a ese mismo módulo, descartando seguramente el resto de partes de un software. Por supuesto, dependiendo de qué formas apliques la modularidad.
No todo serán siempre ventajas, debes tener en cuenta la dependencia entre módulos.
Dependencias
Al empezar a utilizar módulos entramos en el tema de las dependencias.
Mediante un programa que está estructurado de forma modular, tenemos que tener en cuenta que se crea cierta dependencia entre unos elementos y otros.
Por ejemplo, si tenemos una calculadora que está formada por un módulo para la lógica y otro para la interfaz gráfica, ambos módulos son dependientes, ya que uno no va a funcionar sin el otro.
El que haya una dependencia, no implica que el programa deje de funcionar si un módulo falla.
En el ejemplo simple de la calculadora, inevitablemente, si falla uno de los dos módulos, el otro no puede funcionar.
No obstante, si tenemos, por ejemplo, un programa de conversiones de tipos de archivos, podríamos crear un módulo para cada una de las conversiones, uno para PDF, otro para DOCX, otro para TXT, etc.
Si uno de los módulos da problemas, y los has creado para que no sean estrictamente dependientes en el conjunto, no tiene por qué fallar todo el programa.
Espacio publicitario
Podríamos indicar al usuario un mensaje como este:
La conversión ha fallado. Se enviará un reporte para investigar las causas del problema.
Después de mostrar este mensaje, el usuario puede aceptarlo, y continuar con otro tipo de conversión.
Y por la parte de los desarrolladores, podrían recibir información del problema y saber sobre qué módulo concreto empezar a arreglar el fallo.
Ya sé que no es lo ideal; un programa que deje de funcionar en parte, pero peor será si no funciona nada y hay que investigarlo todo.
Los bugs informáticos están presentes desde la cuna de la informática. Un buen ejemplo de ello, es la polilla que encontró Grace Hopper en 1947, la cual ocasionó un mal funcionamiento del sistema informático. Desde entonces, se popularizó el término “bug” para referirse a un fallo informático.
En el contexto de la informática, un bug, se refiere a un fallo informático.
También hay que tener en cuenta otros tipos de dependencias, como la dependencia de funciones o la dependencia de datos.
La dependencia de funciones o métodos es producida cuando un módulo llama a una función o método de otro módulo. Por ejemplo, el módulo de interfaz gráfica de una calculadora, que llama a la función de suma del módulo de lógica.
En este caso, si falla esta función, deberíamos preparar el código para que no falle todo el módulo, y por ende, el programa entero de esta calculadora de ejemplo.
Espacio publicitario
Por otro lado, la dependencia de datos se produce cuando un módulo necesita acceder a datos externos para realizar su tarea. Por ejemplo, un módulo de autenticación de sesión de usuarios (login), necesitará una base de datos para funcionar. En ese caso, se genera una dependencia de datos.
En estos casos, podríamos dar caminos alternativos para posibles escenarios de fallos. Por ejemplo, tener más de un servidor con respaldo de los datos.
A esta técnica se le conoce como replicación de datos, y es una excelente solución ante muchas adversidades con los datos.

Si una base de datos falla, tenemos la otra.
Ejemplo real de modularidad
Un buen ejemplo de modularidad en la vida cotidiana, son los smartphones fabricados con módulos. Un smartphone fabricado de esta forma, si se estropea algo como el módulo de carga, lo reemplazamos por otro, de una forma fácil y muy económica (normalmente, no se repara por el bajo coste de este).

¿Qué ocurre con los smartphones que llevan todo o casi todo integrado de forma única en la placa base?
Lo que ocurre, es que los tenemos que reparar. Hay que desoldar la parte afectada y soldar una nueva, ya que cambiar la placa base entera, no sería rentable.
Además, al venir todo junto, no podemos realizar pruebas individuales, sustituyendo los módulos y probando de uno en uno.
En Python ocurre igual. Supón que hacemos un videojuego y vemos que los vehículos que se generan, están teniendo problemas. Si tenemos todo el código en un mismo sitio, nos costará mucho encontrar el problema, entre miles y miles de líneas de código.
En cambio, si tenemos un módulo, o varios de ellos solo para los vehículos, iremos a revisar el fallo en dichos módulos. Más fácil, ¿verdad?
Espacio publicitario
Reutilización de código
Los módulos nos dan la posibilidad de reutilizar código en diferentes programas. Esto ahorra mucho tiempo, al no tener que reescribir el mismo código una y otra vez.
Es muy fácil trabajar en equipo, si cada uno trabaja con sus propios módulos. También es muy sencillo reutilizar un módulo de Python, tantas veces como quieras.
Por ejemplo, podrías crear un módulo que sirva para leer archivos PDF.
Cada vez que necesites añadir esta funcionalidad a cualquiera de tus programas, lo podrás hacer con una simple importación.
Mejora de la legibilidad del código
Los módulos dividen el código en partes más pequeñas, lo que hace que sea más fácil y rápido entender cómo funciona el programa.
Mejora de la mantenibilidad del código
Los módulos bien hechos, se dedican a cierta tarea específica. Esto hace que sea más fácil realizar cambios en el código sin afectar a otras partes del programa.
Por ejemplo, tenemos una aplicación que tiene operaciones de edición de archivos de imagen.
Supongamos que tiene diferentes opciones como redimensionar, duplicar, mejorar calidad, cambiar el tono de color, etc.
Cada una de estas operaciones, se podrían manejar desde diferentes módulos dedicados a ellas. Por lo tanto, si en algún momento queremos añadir una nueva funcionalidad al programa, o queremos mejorar una existente, no tendremos que tocar nada más del programa, que no sea exactamente la parte deseada, sin miedo a “romperlo” todo.
Espacio publicitario
Si en algún momento detectamos algún tipo de fallo en el módulo, de por ejemplo, redimensión de imágenes, simplemente nos dirigimos al módulo responsable y analizamos su código, sobre el resto no habrá porque tocar nada. Eso sí, siempre que hayamos implementado los módulos de forma apropiada y teniendo en cuenta que el módulo puede tener ciertas dependencias que puede que necesiten ser analizadas.
Organización del código
Gracias a los módulos, podemos construir una organización excelente, al poder fraccionarlo todo en partes más pequeñas.
Rendimiento
Además, mejorará el uso de recursos del sistema, al tener la posibilidad de tener parte del código de un software “durmiendo” a la espera de necesitar ejecutarse, solo cuando sea necesario.
La biblioteca estándar de Python
La biblioteca estándar de Python es una colección de módulos integrados que se incluyen con todas las instalaciones de Python. Es una colección de módulos ya predefinidos e instalados por defecto en Python. Estos módulos no son más que archivos que contienen código Python que define funciones, variables y clases que puedes usar en tus propios programas.
Puedes visitarla en el siguiente enlace: Biblioteca estándar de Python
Espacio publicitario
Espacio publicitario
Espacio publicitario