Métodos en programación

Por GameDevTraum

Introducción

En este artículo vemos qué son los métodos en programación, para qué sirven y cómo declararlos en lenguaje C#, con ejemplos de programación con el motor Unity.

En los siguientes dos videos se ve el concepto de método en informática y cómo ejecutarlos desde el mismo Script en el que están definidos o desde otro Script.

Concepto y Ejemplos de métodos en Informática

Llamar funciones definidas en otro Script

Puedes unite al canal aquí >

¿Qué es un método en programación?

En este contexto un método es una función que en su interior tiene definido un conjunto de instrucciones.

El método tiene un nombre para identificarlo.

Podemos hacer que requiera datos de entrada de distinto tipo para ejecutarse. Y podemos hacer que el método devuelva como resultado un dato.

Cuando necesitamos ejecutar las instrucciones que contiene el método, lo hacemos simplemente utilizando su nombre.

cuadro que describe las propiedades basicas de los metodos en programacion, parámetros, visibilidad
Fig. 1: Esquema que ilustra las propiedades básicas de un método.

Módularización

En la figura 1 vemos al método representado como una caja, en la que aparece el nombre del método como título, se especifica el inicio y el final del método y el conjunto de instrucciones se encuentra dentro de esta región.

Para entender de qué se trata la modularización vamos a ver la figura 2. En la izquierda vemos representada una lista larga de instrucciones de programación.

Ahora dentro de esa lista hay cierto número de instrucciones que se utilizan en más de un lugar, las instrucciones A, B, C y D. Digamos que estas instrucciones realizan una tarea en concreto y siempre se ejecutan juntas.

metodos en programacion, abstraccion y reutilización de código
Fig. 2: A izquierda un código con instrucciones repetidas.
A derecha el mismo código con módulos.

Supongamos que ahora debemos hacer cambios en esas instrucciones (por ejemplo para mejorar la manera en la que resuelve la tarea o agregar funcionalidad), lo que ocurre es que debemos identificar todas las regiones donde están esas instrucciones.

Seria genial si pudiésemos cambiar las cosas en un solo lugar y los cambios se apliquen en todas las regiones donde se usen estas instrucciones, ¿no?

Esto es precisamente lo que logramos con los métodos, nos permiten agrupar conjuntos de instrucciones en un módulo independiente que puede ser llamado cuando sea necesario, como observamos a la derecha en la figura 2, las instrucciones ahora fueron reemplazadas por el nombre del método.

Parámetros de entrada y salida

En la figura 1 hay flechas que entran y salen del método. Con esto intento representar la entrada y salida de parámetros.

Podemos hacer que nuestro méteodo requiera parámetros de entrada, los cuales usamos en el interior para hacer cálculos o realizar cualquier tipo de tarea.

Además podemos hacer que la ejecución del método produzca un dato de salida, que usaremos fuera del método.

Métodos públicos y privados – Visibilidad

Por último en la figura 1 vemos un ojo normal y otro ojo tachado. Esto representa la visibilidad que tendrá el método, lo cual es un tema de programación orientada a objetos, no vamos a profundizar en este artículo pero en principio digamos que podemos tener métodos públicos y métodos privados.

Los métodos públicos podremos ejecutarlos desde otros Scripts por ejemplo, o podremos ejecutarlos desde un componente en la jerarquía en Unity, por ejemplo un botón.

Los métodos privados no serán accesibles desde contextos externos al Script donde está definido.

Sintaxis

La sintaxis es el conjunto de reglas establecidas en un lenguaje para escribir el código, en la figura 3 vemos posibles sintaxis de un método,

sintaxis de los métodos en programación en java y c#
Fig. 3: Distintas combinaciones de parámetros de entrada y salida para los métodos.

Esta sintaxis se puede aplicar al lenguaje C# y Java, un detalle es que todos los métodos son públicos, pero podríamos reemplazar la palabra “public” por “private” y la sintaxis sería correcta.

Declaración del método

Ejemplo 1

Analicemos el método que se encuentra arriba a la izquierda en la figura 3. Tenemos la estructura de un método público que no requiere parámetros y no devuelve parámetros.

Esta estructura la podemos encontrar por ejemplo en el script “GameControl” del proyecto Mi primer juego en Unity.
Trabajamos en este script en el video 4 de la serie.

proyecto unity.  codigo c#. metodo perteneciente a una clase que coloca al personaje en una posicion aleatoria del escenario
Fig. 4: Método perteneciente al script: “GameControl”.

Observamos que ha sido declarado como privado en lugar de público, seguidamente encontramos la palabra “void” con la que indicamos que este método no va a devolver parámetros.
Luego el nombre del método: “placePlayerRandomly”.
Se abre y se cierran paréntesis con lo que se indica que este método no necesita que le demos parámetros.

El comienzo y final del método se indica utilizando llaves. En el interior estarán todas las instrucciones del método.

Invocación o llamada al método

Una vez que el método está definido podemos hacer que se ejecute desde cualquier parte del script, incluso podemos invocarlo desde otros scripts.

En la siguiente figura se muestra la invocación al método “placePlayerRandomly” efectuada en el método “startGame” del mismo script “GameControl”.

proyecto unity.  codigo c#. metodo perteneciente a una clase que realiza todas las acciones necesarias para empezar el juego
Fig. 5: En amarillo: invocación al método “placePlayerRandomly”.

Para invocar este método se escribe su nombre y se abren y cierran paréntesis, cerramos la instrucción con punto y coma. Haciendo esto estamos logrando que se ejecuten todas las instrucciones del método.

Noten como los nombres de los métodos ya nos van ayudando a entender lo que está pasando. Al comenzar el juego se debe colocar el personaje aleatoriamente.

Desde el punto de vista de “startGame” el método “placePlayerRandomly” es una función que hace todo lo necesario para colocar el personaje aleatoriamente. El método “startGame” no sabe cómo es que lo hace exactamente pero no le importa, debido a que “placePlayerRandomly” hace bien su trabajo.

Ejemplo 2

En la esquina superior derecha de la figura 3 tenemos la estructura de un método que no devuelve parámetros pero si los requiere para funcionar.

proyecto unity.  codigo c#. metodo perteneciente a una clase que modifica la interfaz gráfica para mostrar el tiempo de la partida
Fig. 6: Método “writeTimer” del script UIManager.

Este método requiere dos parámetros para funcionar: un valor entero m que indicará los minutos del timer y un valor entero s que indicará los segundos.

proyecto unity.  codigo c#. metodo perteneciente a una clase que se encarga de añadir segundos al timer
Fig. 7: Invocación al método “writeTimer” desde el Script “Timer”.

La invocación de este método ocurre en varios lugares del código, en particular el método “addSeconds” perteneciente al Script “Timer”, este método recibe como parámetros un entero “s” que representa la cantidad de segundos que se deben agregar al timer debido a que el personaje agarró uno de los relojes que hay en el escenario.
El método “addSeconds” hace algunas operaciones con la variable “s” para actualizar el tiempo y finalmente ejecuta el método “writeTimer” que muestra los nuevos valores de tiempo en pantalla.

Dos observaciones: la primera es que como estamos ejecutando el método desde otro Script es necesario agregar “uiManager.” (prestar atención al punto) antes de escribir el nombre del método “writeTimer”.
La segunda es que los parámetros se ingresan dentro de los paréntesis y separados por coma.

En ambos scripts utilicé nombres confusos (m y s) a propósito para que en el futuro, cuando hablemos sobre contextos, nos sirva para analizar.

Ejemplo 3

Pasamos a los métodos que devuelven parámetros.

El siguiente ejemplo que se corresponde con la estructura ilustrada en la esquina inferior izquierda de la figura 3, un método que devuelve un dato y no requiere parámetros para funcionar.

proyecto unity.  codigo c#.metodo perteneciente a una clase que devuelve una posicion aleatoria dentro de una determinada pieza.
Fig. 8: Método “getRandomPosition” del Script “LabyrinthPiece”.

El dato que devuelve este método es un “Vector3” y se indica en la declaración, luego de la palabra “public”. Observen que la primer línea que no es un comentario dice: “Vector3 position;”, ahí estamos declarando un Vector3 que llamamos “position”, luego hacemos algunos cálculos y al final del método escribimos: “return position;” indicando que devolvemos ese Vector3.

Este método lo que hace es devolver un Vector3 (componente x,y,z) que representa una posición aleatoria que pertenece al interior de una determinada pieza de laberinto. De esta forma podemos usar esa posición para colocar el pedestal o los relojes sin preocuparnos por ejemplo de que aparezcan incrustados en una pared.

proyecto unity.  codigo c#. llamado del metodo que devuelva una posicion aleatoria del escenario
Fig. 9: Invocación al método “getRandomPosition”.

No es fácil entender la instrucción resaltada en la figura 9. Por ahora observemos dos cosas, la primera es que hacemos una llamada al método “getRandomPosition” utilizando su nombre (como se ve al final de la instrucción). La segunda es que el resultado de esa invocación es un dato Vector3, por lo tanto, utilizando el signo igual, lo asignamos al dato “rP” que se define como Vector3.

Ejemplo 4

El último ejemplo se corresponde con la estructura ilustrada en la esquina inferior derecha de la figura 3, un método que devuelve un dato y requiere parámetros para funcionar.

proyecto unity.  codigo c#. metodo para comparar las puntuaciones de los jugadores
Fig. 10: Declaración del método “isBestScore”.

Vemos que en la declaración decimos que el método “isBestScore” devuelve un dato tipo bool y requiere un dato tipo int que llamamos “val”.

Si querés saber un poco sobre datos primitivos te invito a leer este artículo sobre variables o ver este video.

El método “isBestScore” devuelve una variable que puede valer verdadero o false (true or false). La utilidad de este método es que lo utilizamos para preguntar si la puntuación obtenida en la partida (val) es mejor que la que hay guardada hasta el momento (bestScoreValue).

proyecto unity.  codigo c#. utilizacion del metodo para comparar las puntuaciones de los jugadores
Fig. 11: Invocación del método “isBestScore”.

La invocación a este método se hace en el método “gameWon”. Como el método devuelve un valor tipo bool, lo podemos usar directamente como argumento de una sentencia if, debido a que “score.isBestScore(time)” es equivalente a tener un valor verdadero o falso.

Método StartGame del Script GameControl

Para terminar la figura 12 se observa el método “startGame” junto con los demás métodos a los que va invocando.

Además de agrupar instrucciones, un método debe tener un propósito bien establecido y que sea coherente con el nombre que le dimos, de esta forma podremos saber rápidamente cúal es su funcion y qué tipo de instrucciones puede contener.

proyecto unity.  codigo c#. esquema de la ejecucion del juego, metodo startGame
Fig. 12: Declaración del método “isBestScore”.

Por ejemplo el método “startGame” se encarga de coordinar una serie de acciones para comenzar el juego, pero no es él quien directamente realiza estas acciones, sino que invoca a otros métodos con tareas más específicas.

De esta forma nos resulta más simple realizar modificaciones en el código y depurar errores.

Conclusión

Los métodos constituyen una poderosa herramienta a la hora de elaborar soluciones específicas, eficientes, reutilizables y sostenibles en el tiempo.

Sostenibles en el tiempo porque en todas las etapas del desarrollo deberemos hacer cambios, de modo que tenemos que ser capaces de recordar o comprender rápidamente cómo funciona nuestro código.

Esto se logra utilizando nombres descriptivos, documentando nuestro código y aplicando el paradigma de orientación a objetos.