
Oh magníficos bloques de código que agrupan nuestras instrucciones para una cosa específica y nos permiten reutilizarlas.
Si, bueno, eso es lo que es una función… un bloque de código que contiene instrucciones para hacer una actividad específica, independiente del resto del código y que nos permite llamarla y reutilizarla en otras partes de nuestro código cuando la necesitamos.
Nos permiten segmentar nuestro algoritmo en pequeñas partes que podemos utilizar y reutilizar ayudándonos a mejorar la legibilidad ya que es una herramienta que fomenta la simplicidad y la claridad, además de permitirnos reutilizar bloques de código que ya hemos escrito antes evitando la repetición de código.
Pensar y crear buenas funciones es una de las tareas más importantes que tenemos, ya que de ellas va a depender en gran medida no solo el tiempo que tardemos en programar en el presente, sino que a futuro serán la piedra angular de la mantenibilidad y extensibilidad de nuestra aplicación.
Debemos recordar siempre estas características de una función: debe contener instrucciones que nos permitan realizar una actividad específica (y solamente esa actividad), debe ser independiente (o sea, que no debe depender de una parte del resto del código) y debe ser reutilizable (si escribo una función que unicamente puedo utilizar una vez, está muy lindo para ordenar el código, pero como función es un poco inútil la pobre…).
Además debemos considerar futuros escenarios de uso de una función. Yo puedo escribir ahora una función que suma dos números, pero ¿siempre la necesidad de mi sistema va a ser la de sumar dos números? Si puedo identificar que en un futuro voy a necesitar sumar 3 o más, posiblemente va a ser mejor que mi función no reciba dos números sino un array de números para sumar.
Oh, pero eso la hace menos eficiente para lo que necesito en el momento que es sumar dos números (para sumar un array posiblemente tenga que hacer un bucle que lo recorra)… y sí, si fuera tan sencillo todo el mundo lo haría… cuando nos enfrentamos a éstas situaciones debemos analizar un montón de cosas… ¿qué es mejor? ¿qué estamos dispuestos a sacrificar y qué necesitamos priorizar? Claramente si no vamos a sacrificar recursos o eficiencia en pro de la reusabilidad de nuestra función en otro escenario nos vamos a quedar con los dos números, si vamos a sacrificarlo para tener una función que nos sirva para realizar cualquier tipo de suma nos vamos a quedar con el array… o, tal vez, llegamos a la conclusión de que nos quedamos con los dos números por la eficiencia de la función pero en un futuro deberemos añadir otra función para el array de números conservando ambas funciones de suma. ¡El límite es su imaginación y capacidad analítica de los requerimientos!
Anatomía de una función:
(Quería poner anatomía de algo... está de moda... déjenme ser...)
Sin importar el lenguaje que utilicemos van a existir cinco cosas que nos permiten definir una función:
Ejemplo en JavaScript:
function sumar(a, b) {
return a + b
}
Ejemplo en Python:
def sumar(a, b):
return a + b
Ejemplo en Ruby:
def sumar(a, b)
return a + b
end
Ejemplo en PHP:
function sumar($a, $b) {
return $a + $b;
}
Muy lindas las funciones… pero ¿cómo las uso después?
Ok, si, para usar una función es suficiente con invocarla.
Una invocación o llamada a una función es lo que le indica a nuestro programa que llegó el momento de ejecutar las instrucciones que contiene.
Dependiendo de si nuestra función unicamente hace cosas o si necesitamos ese valor de retorno que nos devuelve vamos a asignar la llamada a una variable donde guardarlo o no.
Pero, principalmente la invocación está compuesta de dos elementos:
Ejemplo en JavaScript:
let resultado1 = sumar(2, 3)
let resultado2 = sumar(4, 5)
let resultado3 = sumar(6, 7)
console.log(resultado1, resultado2, resultado3)
Ejemplo en Python:
resultado1 = sumar(2, 3)
resultado2 = sumar(4, 5)
resultado3 = sumar(6, 7)
print(resultado1, resultado2, resultado3)
Ejemplo en Ruby:
resultado1 = sumar(2, 3)
resultado2 = sumar(4, 5)
resultado3 = sumar(6, 7)
puts resultado1, resultado2, resultado3
Ejemplo en PHP:
$resultado1 = sumar(2, 3);
$resultado2 = sumar(4, 5);
$resultado3 = sumar(6, 7);
echo $resultado1 . " " . $resultado2 . " " . $resultado3;
En los ejemplos creamos funciones que suman dos números en cuatro lenguajes, las invocamos con 3 llamadas diferentes y mostramos los resultados. Para mostrar los resultados, utilizamos una función que nos proporciona cada lenguaje y que no nos devuelve nada (no como nuestra función que si devuelve el resultado de la suma) por lo que no necesitamos asignar su ejecución a ninguna variable.
Alcance de una función:
El scope o alcance de una función es el entorno que tiene acceso a una función.
O sea, es lo que determina desde donde la función puede ser invocada.
El alcance puede ser público o privado.
Cuando hablamos de un scope público o global, hablamos del entorno completo de nuestro algoritmo o programa, donde todo nuestro código tiene acceso a la función pública.
Por otro lado cuando hablamos de un scope privado o local, hablamos de que la función solo puede ser invocada dentro de un contexto o algoritmo.
Al momento de determinar cual será el alcance de nuestras funciones debemos tener en cuenta y analizar cierta lógica de negocio y de los datos con los que tratamos. Si tratamos con información muy compleja que escapa del ambito de nuestro algoritmo necesitaremos de funciones públicas (o globales), en cambio si tratamos con información que no puede ser compartida entre los diferentes algoritmos necesitaremos de funciones privadas (o locales).
Como se comporta y funciona un scope, tanto para funciones como para variables suele tener la misma base, pero puede variar un poco en su implementación de un lenguaje a otro, por lo que es algo que revisar cuando nos ponemos a trabajar con un nuevo lenguaje.
Espero que les haya gustado el artículo y les sirva para algo! También espero que practiquen crear funciones en sus lenguajes favoritos, que piensen en todas las posibilidades que les brindan y al escribirlas razonen que variaciones podrían tener que les faciliten el codeo a futuro!
¡Gracias por leer!