Encapsulamiento y Generalización en Python
Uno de los primeros hábitos que conviene desarrollar al aprender a programar consiste en identificar fragmentos de código que pueden reutilizarse. Dos conceptos nos ayudan a conseguirlo: encapsulamiento y generalización.
El encapsulamiento consiste en tomar un bloque de código y envolverlo dentro de una función. De esa forma dejamos de pensar en una secuencia de instrucciones y comenzamos a pensar en una operación que puede ejecutarse cada vez que la necesitemos.
La generalización, por otra parte, consiste en tomar una solución específica y convertirla en una solución más amplia. En lugar de escribir un programa que únicamente imprima los múltiplos de 2, podemos escribir uno que imprima los múltiplos de cualquier número.
Supongamos que tenemos el siguiente ciclo:
i = 1
while i <= 6:
print 2 * i, '\',
i = i + 1
print
Este programa funciona correctamente, pero solamente sirve para imprimir los primeros seis múltiplos del número 2.
Podemos encapsular ese comportamiento dentro de una función y, al mismo tiempo, generalizarlo sustituyendo el valor constante por un parámetro.
def imprimeMultiplos(n):
i = 1
while i <= 6:
print n * i, '\',
i = i + 1
print
Para encapsular el código únicamente fue necesario agregar la definición de la función.
Para generalizarlo bastó con reemplazar el valor fijo 2 por el parámetro n.
Ahora la función ya no está limitada a un único caso. Podemos reutilizarla para cualquier número.
Si la invocamos con el valor 2, obtendremos exactamente el mismo resultado que producía el programa original.
Con el valor 3 obtenemos:
>>> imprimeMultiplos(3)
3 6 9 12 15 18
Y con el valor 4:
>>> imprimeMultiplos(4)
4 8 12 16 20 24
La ventaja comienza a hacerse evidente. Ya no necesitamos escribir un programa distinto para cada tabla de multiplicar; basta con cambiar el argumento de la función.
De hecho, podemos aprovechar esa misma función para generar varias tablas utilizando otro ciclo.
i = 1
while i <= 6:
imprimeMultiplos(i)
i = i + 1
Observa que este ciclo es muy parecido al que existe dentro de imprimeMultiplos(). La diferencia es que ahora, en lugar de imprimir un número, llamamos a otra función.
La salida del programa completo será:
1 2 3 4 5 6
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24
5 10 15 20 25 30
6 12 18 24 30 36
Aunque este ejemplo es muy sencillo, ilustra una de las ideas fundamentales de la programación.
Cuando encontramos código que realiza una tarea específica, normalmente podemos encapsularlo dentro de una función. Si además identificamos qué parte del código cambia y la convertimos en un parámetro, habremos transformado una solución particular en una herramienta reutilizable.
Ese es, precisamente, uno de los principales objetivos de las funciones: escribir una vez el código y utilizarlo tantas veces como sea necesario.