Aquí hablaremos de funciones, una de las herramientas fundamentales a la hora de escribir nuestros programas. Veremos qué son y por qué son tan importantes.
Imaginemos un programa grande, como un Word de un Excel, son millones de líneas de código, imposible de manejar si no se organiza de alguna manera.
Para solucionar este tipo de cosas tenemos algo llamado funciones. Una función la podemos ver como un bloquecito de código que hace algo, y sigue la estrategia de “divide y vencerás”.
Tenemos una tarea grande, difícil. La podemos dividir en tareas más pequeñas, fáciles de resolver.
Resolvemos estas tareas y unimos esa solución.
Nuestro programa es como esta tarea, es grande, tiene muchas funcionalidades, hace muchas cosas, y a la hora de programarlo lo dividimos en partes más pequeñas, funcionalidades más simples, y luego invocamos estas soluciones. Por lo general nuestro programa principal termina teniendo unas pocas líneas que invocan funciones.
Estuvimos usando funciones pero no las vimos, todo programa arranca por una función principal por ejemplo Main.
También usamos las primitivas read, print, que son funciones que se comunican con el sistema operativo.
A las funciones las podemos ver también como una cajita, tiene un nombre, una entrada y una salida, es un bloquecito que hace algo.
A la hora de crearla encapsula la tarea que ejecuta y a la hora de usarla es como una caja negra, invoco a la función, no me importa cómo lo hace, solo sé que lo hace y me sirve tomar el resultado.
Tiene un nombre la función, tiene que ser algo que lo represente, que indique lo que hace, para poder entenderlo.
La entrada son los parámetros, los parámetros son los datos, las variables que le pasamos a una función.
Pensemos a la función como una caja cerrada, sólo puede usar lo que le pasamos.
Y desde afuera tampoco vemos lo que tiene adentro, solo vemos el resultado.
Esto nos lleva al concepto de scope, el ámbito de las variables, donde viven, desde dónde se pueden usar.
Una función puede crear sus propias variables, son variables locales a la función, desde afuera no las vemos.
Y también tenemos variables globales, que según el lenguaje se crean afuera o se declaran como variables globales, y se pueden usar en todo el programa, incluso dentro de las funciones por más que no las pasemos como parámetro.
Es una mala práctica usar variables globales porque viven toda la vida del programa ocupando memoria, y el programa se vuelve más difícil de depurar, porque cuesta detectar donde cambiar el valor de la variable. Así que nos olvidamos de las variables globales y pasamos parámetros de entrada a la función..
Y la salida, el resultado que devuelve, devuelve un solo resultado.
Debemos decir qué tipo de dato retorna.
Por ejemplo tenemos la función promedio, que retorna un tipo decimal y recibe tres parámetros, tres notas que pueden ser de tipo decimal. Crea la variable local resultado, suma las tres notas, las divide por 3 y retorna ese resultado.
Donde queremos usarla la invocamos con el nombre y pasándole los parámetros. La podemos usar las veces que queremos.
Evita que dupliquemos código, ya que podemos invocar la función las veces que necesitemos, no tenemos que escribir el mismo código dos veces.
Otra ventaja es que podemos usar bibliotecas de funciones hechas por otros, podemos incluirlas en nuestro programa y las usamos, ganamos tiempo, favorece la reutilización de código.
Si juntamos estas dos cosas por un lado, vemos que permite el trabajo en equipo. Tenemos un trabajo que hacer, lo podemos dividir en partes, en módulos, en funciones. Cada uno hace una parte y luego se integran, es algo muy útil.
Algo importante de las funciones son los pasajes de parámetros por valor y por referencia.
Cuando le pasamos un parámetro, un datos de entrada, a una función, podemos cambiar su valor dentro de la función, y que este nuevo valor se vea reflejado afuera de la misma. Esto se conoce como pasaje por referencia.
Para indicar pasaje por referencia se pasa el parámetro con una indicación especial, que depende del lenguaje, por ejemplo en algunos se pasan con un ampersand (&). Al pasarla así, si se modifica adentro, el cambio se ve reflejado afuera.
En el pasaje por valor, si la variable cambia dentro de la función, no se ve afectado el valor afuera, al salir de la función (mantiene el que tenía al ingresar).
Para concluir el tema funciones, las buenas prácticas dicen que cada función debe realizar una sola tarea y que su nombre debe ser representativo.
Hasta aquí llegamos con el tema funciones, este es uno de los temas básicos que debe dominar un programador, y la única forma de lograrlo es practicando, no alcanza con solo leer teoría. En el próximo artículo veremos Arrays, una variable que permite almacenar más de un valor.