Curse of Coding

Funciones

Hemos llegado a uno de los temas más divertidos desde mi punto de vista, las funciones.

Una función es un conjunto de instrucciones bajo un nombre que nos va a ayudar a reutilizar código y mantenerlo ordenado.

Cuando estamos escribiendo funciones, estamos dividiendo nuestro código en partes más pequeñas y manejables, lo que nos permite reutilizar el código en diferentes partes de nuestro programa.

Una función es la encargada de realizar una acción en nuestro programa, mostrar algo en pantalla, realizar una operación matemática, etc.

Vamos a desarrollar ahora una pelea de Isaac vs The Fallen.

Isaac
The Fallen
c++
1#include <iostream>
2
3using namespace std;
4
5void shoot() {
6 cout << "Isaac dispara contra The Fallen: ●" << endl;
7}
8
9void enemyHit(string enemy) {
10 cout << "¡" << enemy << " golpeó a Isaac!" << endl;
11}
12
13int takeDamage(int health) {
14 return health - 1;
15}
16
17int main() {
18
19 int isaacHealth = 3;
20 int theFallenHealth = 5;
21 char answer;
22
23
24 cout << "¡Isaac entra a una habitación!" << endl;
25
26 while (isaacHealth > 0 && theFallenHealth > 0) {
27
28 cout << "¿Disparar? (s/n): " << endl;
29 cin >> answer;
30
31 if (answer == 's') {
32 shoot();
33 theFallenHealth = takeDamage(theFallenHealth);
34 }
35
36 cout << "¿Te han dañado? (s/n): " << endl;
37 cin >> answer;
38
39 if (answer == 's') {
40 enemyHit("The Falle");
41 isaacHealth = takeDamage(isaacHealth);
42 }
43
44 }
45
46 if (isaacHealth == 0) {
47 cout << "¡Isaac ha muerto!" << endl;
48 }
49
50 if (theFallenHealth == 0) {
51 cout << "¡Isaac ha derrotado a The Fallen!" << endl;
52 }
53
54 return 0;
55}

¡Esto es lo más cerca que hemos estado de programar un videojuego! Vamos a explicar el código anterior para que entiendas cómo es que funciona.

Las funciones shoot y enemyHit son de tipo void porque no retornan ningún valor, solo ejecutan una acción, en este caso, mostrar un mensaje.

Sin embargo, nuestra función takeDamage(int health) retorna un valor entero que es la vida restante después de recibir daño y además recibe un parámetro, que es la vida actual.

Cuando pasamos el valor de una variable a una función se llama paso por valor, esto significa que estamos pasando una copia de nuestra variable para que la función la utilice y realiza acciones con ese valor, es por eso que la variable original no se modifica y necesitamos asignarla de nuevo para que refleje el nuevo valor, como:

isaacHealth = takeDamage(isaacHealth);

Asignamos el valor retornado por la función a la variable original.

Cuando empezaba a programar una de mis primeras dudas se relacionaba con el nombre de las variables que se pasaban como parámetro, por ejemplo, en la función takeDamage(int health), el parámetro se llama health, pero en el main() la variable se llama isaacHealth.

Esto puede ser confuso al principio, pero es importante entender que el nombre del parámetro es sólo una etiqueta interna de la función, no afecta el nombre de la variable que se pasa como argumento.

Es como si le presentaras a tu función un valor con un apodo, el apodo puede llamarse exactamente igual que la variable original o completamente diferente, sin embargo, deberá llamarse igual dentro de la función para poder ser utilizada.

Consejos

Usa nombres descriptivos

Los nombres de las funciones y variables deben ser descriptivos y claros, de esta manera otros programadores (o tú en el futuro) podrán entender fácilmente qué hace cada función y variable.

Funciones pequeñas y enfocadas

Mantén tus funciones pequeñas y enfocadas en una sola tarea, es decir, que realicen una sola acción, con esto no nos referimos a separar en funciones múltiples acciones que formen un todo, sino a que cada función tenga un propósito claro y específico.

Funciones válidas:

Funciones sin sentido:

Con esto terminamos esta sección sobre funciones, nos ayudará a mantener nuestro código más ordenado en futuros programas que serán cada vez más completos.

CiclosArrays & Estructuras