Iniciación a la programación: Métodos (parte 6)

Estándar

Esta semana vamos a hablar de métodos en nuestra serie de introducción a la programación.Un método no es más que una agrupación de código con una funcionalidad definida al que se le introducen unos parámetros (variables) y que devuelve una salidas. Podríamos pensar en él como una caja negra a la cual le introducimos una serie de valores definidos por la misma y que, tras sus propios procedimientos internos, nos retorna algún valor de resultado, o ninguno en algunos casos.

La funcionalidad de estos métodos es clara, agrupar fragmentos de códigos para hacerlos reusables en toda nuestra aplicación y, a su vez, hacerla más legible y modular, ya que habitualmente una aplicación puede tener miles y miles de líneas en un mismo fichero y sería infumable para cualquier humano medio.

¿Qué podemos meter en un método? Virtualmente cualquier cosa. Podemos trasladar cualquier trozo de código pululando por nuestra aplicación a un método nuevo y reemplazar el hueco que ha dejado por una llamada al método, lo que sería equivalente a seguir teniéndolo donde estaba previamente.

¿Qué pinta tiene un método en java? La siguiente:

tipo_retornos nombre_metodo(parámetros) {
	Código del método

	Retorno de valor de la función (si necesario)
}

Pero antes de seguir con ejemplos prácticos de métodos introducimos nuevos conceptos en nuestro vocabulario programador.

Ámbito

El concepto de ámbito es un tema a veces complejo de comprender por la gente que empieza a programar. Un ámbito podríamos decir que es un cajón donde tenemos nuestras variables, métodos y básicamente todo que lo que pueda ser identificado, es decir que podemos nombrarlo en el código. En los lenguajes como Java, cada vez que abrimos una llave para comenzar un nuevo bloque comienza un nuevo ámbito, y como habréis podido adivinar, unos ámbitos pueden contener a otros. ¿Por qué esta necesidad de ámbitos? Normalmente por simpleza, porque no son del todo necesarios, ya que algunos lenguajes no hace uso de ellos y todos los identificadores declarados en cualquier parte del programa son potencialmente usables desde cualquier otro punto.

El ámbito nos crea una zona donde podemos declarar nuestros identificadores sin miedo a que cuando salgamos del mismo estos vayan a seguir siendo accesibles, es decir que si declaramos una variable de nombre miVar dentro de un ámbito, esta sólo será visible dentro del mismo lo que implica que será imposible usarla cuando el ámbito se cierre (cuando la llave de cierre correspondiente aparezca). Normalmente no podemos hacer uso del mismo idenficador en un mismo ámbito, aunque existen excepciones, pero por ejemplo, no podremos tener dos variables con el mismo nombre dentro de un mismo ámbito.

Sobrecarga de métodos

En cuanto a los métodos, que también son definidos por sus identificadores, si que podemos tener dos métodos con el mismo nombre (al menos en Java), pero deben diferenciarse por sus parámetros, en tipo o en número. Esto es asi porque el método internamente no se identifica por su nombre, sino por su signatura (o firma) del método, que comprende tanto su nombre como el tipo y número de sus parámetros, por lo que el compilador de Java los verá distintos sin dudarlo ni un momento. A esto se le llama sobrecarga de métodos y es muy útil si dos métodos hacen semánticamente lo mismo, pero cambia su implementación segun el tipo o número de parámetros que le pasemos.

Por ejemplo, si en la definición de un problema nos encontramos con que tenemos dos especificaciones para una suma, una a la que dándole un número sumaría automáticamente 5 (porque nuestra aplicación lo va a usar mucho) y otra como la que todos conocemos, que toma dos números y devuelve la suma de ambos podríamos tener dos métodos de la siguiente manera:

int suma(int n) {
	return n+5;
}

int suma(int n1, int n2) {
	return n1+n2;
}

Como podemos ver, introducimos un nuevo tipo de sentencia, el return. Esta palabra reservada se utiliza para indicar al método lo que va a retornar, en nuestro caso la suma de dos números. Es una sentencia que corta el flujo de la función, es decir que una vez ejecutada ese sentencia el método no sigue ejecutándose. Además cabe decir que el tipo de retorno de la función tiene que coincidir con lo que realmente estamos retornando, Java (y todos los lenguajes modernos) es bastante estricto en este sentido y no realiza conversiones implícitas porque suelen provocar errores dificilmente localizables.

Llamada a un método

Con el concepto de método se introduce uno nuevo que es el de la invocación del mismo. No nos vamos a meter mucho en los detalles internos que tiene que realizar la máquina cuando en un punto del programa se llama a un método aunque es un tema muy interesate, pero nos podría ocupar otra serie completa.

Como hemos dicho previamente, donde extraemos el código para hacer la función debemos reemplazar el hueco que nos ha dejado el código por una llamada a una función, y como también hemos dicho se trata de una caja negra por lo que sólo nos preocuparemos de los parámetros que tengamos que proporcionarle al mismo y su tipo de retorno, en el caso en que lo tuviera. De la siguiente manera, por tanto, podríamos llamar a las funciones que hemos definido previamente.


int sum = suma(1, 2);
System.out.println(suma(4));

Como podemos ver, el valor que devuelve el método podemos asignarlo a una variable del mismo tipo o podemos usarlo directamente para hacer cualquier cosa, como por ejemplo imprimirlo por pantalla. De hecho podríamos ignorarlo si quisieramos, sin asignarlo ni hacer nada con él, pero en este caso no tiene mucho sentido.

Void

Existe un tipo de retorno de función que se llama void. No podemos declar una variable de tipo void debido a que no designa un tipo, sino todo lo contrario. Void es la ausencia de tipo, y cuando lo vemos como el tipo de retorno de un método sabemos que no debemos esperar nada de él al su salida. Teóricamente a los métodos que no retornan nada (void) se les llama procedimientos, mientras que a los que si que lo hacen funciones. Digo teóricamente porque realmente acabamos llamando a todo funciones/metodos por simpleza y no existe una diferencia real cuando programamos en un lenguaje de programación moderno, estilo Java.

Referencia y valor

Unos concepto que se aprenden cuando se estudia programación en profundidad son los de valor y referencia y los quebraderos que cabeza que ellos conllevan. Estos términos se utilizan para designar la manera en la que se pasan los parámetros a un método y se refieren a:

  • Valor: un argumento por valor es aquel del que se hace una copia internamente antes de que el método se ejecute y por lo tanto no se puede cambiar modificar el contenido original de la variable. Es decir, una variable que usamos para llamar a un método tendrá el mismo contenido una vez termine el método, se haga lo que se haga dentro del mismo.
  • Referencia: cuando pasamos una variable a un método por referencia estamos utilizando directamente la referencia a la memoria (de ahí su nombre) de dicha variable, con lo que si el programa hace uso de ella y la modifica esta se verá afectada dando lugar a posible efectos laterales no deseados.

El concepto de argumentos por valor y por referencia es muy estudiado en lenguajes como C o C++ en los cuales la reserva de memoria es explícita, al contrario que en Java. En Java, los método siempre utilizan el mismo tipo de paso de argumentos, por valor. Es decir, a pesar de que todo lo que manejamos en Java (exceptuando los tipos básicos como int o double) son referencias a objetos, estas referencias son pasadas por valor y no pueden ser modificadas por el método. En resumen, no es un concepto que nos vaya a servir mucho si vamos a programan en lenguajes como Java.

Y esto ha sido el post de hoy con respecto a los métodos, espero que no haya sido muy lioso ya que hay mucho donde rascar en este tema. Un saludo!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s