sábado, 6 de febrero de 2010

JC7.1 - Metodos en Java y C#

Esta seccion la voy a dividir en dos partes, en la primera parte vamos a hablar de metodos que reciben parametros de tipo valor (value type), y
en la segunda parte de parametros tipo referencia (reference type)

Introduccion: Los metodos son bloques de instrucciones que devuelven algun tipo de valor cuando se ejecutan.

Pueden ser llamados mediante su nombre, llamar a un metodo hace que las instrucciones del metodo se ejecuten.


Formato general de la declaracion de un metodo


La primera linea del metodo se conoce como encabezado del metodo. Despues del encabezado van las declaraciones e instrucciones entre llaves, las cuales forman el cuerpo del metodo.

El formato de la declaracion de un metodo es el siguiente:


Tipo_Valor_Retorno Nombre_Del_Metodo(parametro1, parametro2, ..., parametroN)


{

declaraciones e intrucciones

}


El Nombre_Del_Metodo es cualquier identificador valido. El Tipo_Valor_Retorno es el tipo del resultado devuelto por el metodo solicitante. El Tipo_Valor_Retorno void indica que un metodo no devuelve un valor, parametro1, parametro2, ..., parametroN son los parametros que recibe el metodo para poder realizar su trabajo.
Los parametos se declaran en una lista separada por comas, encerrada entre parentesis, que declara el tipo y el nombre de cada uno de los parametros.
Los metodos pueden devolver como maximo un valor.

NOTA: Todos los metodos solo pueden declararse dentro de una clase.


Ejemplo:


//C#

public class SimpleMethod

{

public static void Main()

{

SimpleMethod mySimpleMethod = new SimpleMethod();

mySimpleMethod.myMethod();

}

void myMethod()

{

System.Console.WriteLine("Hello from CallMethod()!");

}

}




Para llamar a un metodo, se escribe su nombre en el lugar donde deberia ejecutarse el codigo de ese metodo, despues del nombre del metodo se escriben dos parentesis.

Si el metodo se define con una lista de parametros, sus valores deben ser especificados en el momento de llamar al metodo. Debe de especificar los parametros en el mismo orden en que son especificados en la lista de parametros del metodo. Por ejemplo:

//java

void myOtherMethod(int myInteger)

{

System.out.println("myInteger desde CallMetod: " + myInteger);

}




Y lo llamamos con:

mySimpleMethod.myOtherMethod(3);



Para los metodos que regresan un valor los declaramos de la siguiente manera:

//C#

int mySum(int oper1, int oper2)

{

int Sum;

Sum = oper1 + oper2;

return Sum;

}




Y lo llamamos de la siguiente forma asignandolo a una variable:

int myResult;

myResult = mySimpleMethod.mySum(2, 3);



A continuacion separaremos el codigo y diferenciaremos entre java y C# con respecto a la sintaxis de los siguientes conceptos.



Parametros de entrada

Los parametros de entrada son parametros cuyo valor es enviado al metodo. Los parametros de entrada se envian a la funcion, pero el cuerpo del metodo no puede cambiar permanentemente sus valores. Los parametros de entrada se pasan a los metodos por valor, pero no se le permite cambiar el valor proporcionado por la parte que realiza la llamada.


//C#

public class sampleMethod

{

public static void Main()

{

int myInteger;

sampleMethod myObj = new sampleMethod();

myInteger = 3;

myObj.CallMethod(myInteger);

System.Console.WriteLine(myInteger);

}

void CallMethod(int otherInteger)

{

otherInteger = 6;

System.Console.WriteLine(otherInteger);

}

}




//Java

public class Main

{

public static void main(String[] args)

{

int myInteger;

Main myObj = new Main();

myInteger = 3;

myObj.CallMethod(myInteger);

System.out.println(myInteger);

}

void CallMethod(int otherInteger)

{

otherInteger = 6;

System.out.println(otherInteger);

}

}




El ejemplo anterior establece una variable entera llamada myInteger y le asigna el valor 3, a continucacion llama a CallMethod con myInteger como parametro, el metodo CallMethod() establece el valor del parametro en 6 y luego escribe el valor en la consola. Cuando el metodo CallMethod() regresa al metodo Main() continua y escribe el valor de myInteger, esto sucede porque el metodo modifica su copia del parametro de entrada, pero esta no afecta al valor del metodo original proporcionado por Main(). El valor de myInteger sigue siendo 3 despues de que regrese el metodo CallMethod(), debido a que CallMethod() no puede cambiar el valor del parametro de entrada del elemento que hace la llamada. Solo puede cambiar el valor de su copia.

Hasta aqui todo parece similar pero a continuacion vamos a ver como cambiar esos valores de entrada...

Parametros de salida

Los parametros de salida son parametros cuyos valores no se establecen cuando se llama al metodo, en su lugar el metodo establece los valores y los devuelve al elemento que hace la llamada mediante el parametro de salida. Suponga, por ejemplo que quiere escribir un metodo que cuente el numero de registros de una tabla de una base de datos. Supongamos que tambien queremos especificar si la operacion se realizo satisfactoriamente, Por tanto queremos que el metodo devuelva dos instancias de informacion.

  • Un contador de registros

  • Un indicador de exito de operacion


C# y java solo permiten devolver un valor. Que podemos hacer para que devuelva dos instancias de informacion?. La respuesta en el concepto de parametro de salida.
En C# los parametros de salida se especifican en listas de parametros con la palabra clave out. La palabra clave out debe preceder al tipo de parametro en la lista de parametros. Cuando se llama a un metodo con un parametro de salida, se debe de declarar una variable que contenga ese valor. En Java solo se necesita modificar el valor en el metodo internamente como se muestra a continuacion.


//Java


public class Main {

//Declaramos la variable como global de la clase

int myValue;

public static void main(String[] args) {

boolean myBool = false;



myBool = myObj.myOutValue();



System.out.println("myValue : " + String.valueOf(myObj.myValue));

System.out.println("myBool : " + String.valueOf(myBool));

}

boolean myOutValue()

{

myValue = 5;

return true;

}

}






//C#

public class SampleMethod{

public static void Main()

{

int myValue;

myObject = new SampleMethod();

bool myBool = false;

myBool = myObject.CallMethod(out myValue);

Console.WriteLine("myValue : " + myValue);

Console.WriteLine("myBool : " + myBool);

}

static bool CallMethod(out int myInteger)

{

myInteger = 7;

return true;

}

}