Cuando se divide un programa en módulos, la intención es crear una resolución de un problema “grande” a través de soluciones a cada una de sus partes por separado, para luego integrarlas a todas.

Un módulo puede ser cualquier parte de un programa que se encuentra “separada”: es decir, para su utilización deberemos referir a esa otra parte, que se encuentra en otro lugar. En algunos casos se llama módulo a otros archivos; así, podríamos tener un programa grande dividido en varios archivos (por ejemplo, en el caso de un juego, un archivo para la pantalla de inicio, otro para la ayuda y otro para el juego concretamente). En otras ocasiones se denomina módulo a porciones de código que pueden estar o no dentro del mismo archivo donde se utilizan; tal es el caso de los subprogramas, rutinas, funciones, procedimientos, métodos. Es a este último tipo de módulos que nos referiremos en este artículo.

Según el lenguaje y el tipo de módulo del que estemos hablando, un módulo podría retornar un valor o no retornar nada (en Python este “nada” se representa con el valor None, en Java se representa con void, que indican que no hay ningún valor).

Donde en el código aparece una llamada (o “invocación”) a una función, nosotros vemos esa abstracción, pero la computadora ve una indicación para ejecutar el código de la función y obtener un resultado. Entonces, cuando aparece una invocación a una función, se puede decir que, de manera abstracta, esa instrucción de invocación se “reemplaza” por el valor que la función retorna.

Ejemplo 1:

Supongamos una función muy simple en Python, que recibe dos parámetros, los suma y devuelve el resultado, como la que sigue:

def sumarDosNúmeros(numA, numB):
    return numA+numB

Esta función devuelve un número (el resultado de la suma de otros dos números). Entonces, podríamos usar esa función en una expresión, representando a un número:

4 + sumarDosNúmeros(5, 10)

En este caso, la computadora ve el 15 donde nosotros vemos la abstracción sumarDosNúmeros(5, 10) y luego ve el 19 donde nosotros nos abstraemos para ver la expresión completa: 4 + sumarDosNúmeros(5, 10)

Esto suele ser muy útil cuando necesitamos procesar una condición compleja para usar en una iteración o en una selección, porque podemos crear un módulo que resuelva esa condición y devuelva el valor True si la condición se cumple o False si no se cumple. Por ejemplo, supongamos que le pedimos al usuario ingresar un número entero y lo guardamos en la variable llamada num. Y que queremos mostrar el mensaje “este número no me gusta” si se cumple la condición de que el número ingresado por el usuario tiene menos de 3 dígitos, es un múltiplo de 15 y no contiene ningún dígito 0. Si la condición no se cumple, entonces mostramos el mensaje “este número me gusta”. Esta decisión podría escribirse con una estructura como la siguiente:

if condición:
    print("este número no me gusta")
else:
    print("este número me gusta")

Si recordamos que las estructuras como “if” o “while” requieren un valor booleano (True ó False) para decidir si ejecutan las instrucciones que contienen; entonces, en el fragmento de código anterior podemos deducir que condición es una variable booleana (contiene el valor True o el valor False) porque, cuando la computadora resuelva esa abstracción, reemplazará el nombre de la variable por su valor concreto. Por ejemplo, si condición contiene el valor True, la computadora “verá”:

if True:
    print("este número no me gusta")
else:
    print("este número me gusta")

Ahora, para lograr que la variable condición contenga True si la condición descripta en el enunciado es verdadera, o False si la condición es falsa, podemos usar un módulo que lo determine, almacenando su valor de retorno en la variable:

condición = evaluarNúmero(num)

Sabemos, entonces, que la función llamada evaluarNúmero(num) se dedicará a comprobar si la condición se cumple o no, y retornará un valor booleano. Pero podemos dedicarnos a construir el resto del programa, dejando la función para después, y así escribir:

num = int(input())
condición = evaluarNúmero(num)
if condición:
    print("este número no me gusta")
else:
    print("este número me gusta")

O, lo que es equivalente:

num = int(input())
if evaluarNúmero(num):
    print("este número no me gusta")
else:
    print("este número me gusta")

¿Por qué es equivalente? Porque en realidad no necesitamos guardar el resultado de la función en una variable para después usarla: si sabemos que la llamada a la función es una abstracción que la máquina luego reemplaza por el valor que retorna, podemos deducir que donde dice evaluarNúmero(num) habrá un True o un False. Sería similar a escribir:

unValor = 4+11
if unValor==0

…que equivale a poner directamente

if 4+11==0

Ahora que ya tenemos la instrucción de selección que imprime un mensaje u otro dependiendo de si la condición se cumple o no, podemos dedicarnos a construir la función evaluarNúmero(num) que evalúe la condición y retorne True o False. Recordemos que la condición debe ser verdadera si se cumple que: el número ingresado por el usuario tiene menos de 3 dígitos, es un múltiplo de 15 y no contiene ningún dígito 0. Así que necesitamos construir un algoritmo como el siguiente dentro de la función:

def evaluarNúmero(num):
   if num/100 < 1:        #Aclaración 1
      if num%15==0:              #Aclaración 2
          hayCero=False            #Aclaración 3
          while num != 0:
              ultimoDigito=num%10
              if ultimoDigito==0:
                  hayCero=True           #Aclaración 4
              num=num//10
          if hayCero:              #Aclaración 5
              return False
          else:                    #Aclaración 6
              return True
      else:
          return False       #Aclaración 7
   else:
      return False     #Aclaración 8

Las aclaraciones sobre cómo se construyó el algoritmo (escritas aparte para no “ensuciar” el código):

  • Aclaración 1: un número de menos de 3 digitos tiene la particularidad de que, al dividirlo por 100, da un resultado menor a 1, entonces usamos esta estrategia.
  • Aclaración 2: un número múltiplo de 15, al dividirlo por 15 da resto 0.
  • Aclaración 3: vamos a empezar a buscar si hay algún cero, entonces, si lo encontramos, ponemos la variable hayCero en True.
  • Aclaración 4: si sucede que encuentra un cero en el número, entonces pone la variable hayCero en True.
  • Aclaración 5: si hay algún 0, la condición no se cumple.
  • Aclaración 6: si la variable hayCero tiene el valor False, la condición termina por cumplirse.
  • Aclaración 7: si el número no es múltiplo de 15, la condición no se cumple.
  • Aclaración 8: si el número no tiene menos de 3 dígitos, la condición no se cumple.