miércoles, enero 10, 2007

ABSTRACCIÓN FUNCIONAL
( PARTE III DE IV )


Abstracción Funcional en Java.

Fundamentos de los subprogramas.

En Java no existen distinciones entre funciones y procedimientos formalmente. En este lenguaje solo se tienen métodos, y según la situación, se comportarán como una función o como un procedimiento.
Lista de parámetros: la lista de parámetros (argumentos) es una lista de las declaraciones de parámetros que se pasan al método para su ejecución.

La lista puede estar vacía pero los paréntesis son obligados:

public void suficiente() // Correcto

public void pocaCosa // Error de sintaxis.


Es obligatorio indicar el tipo de cada parámetro:


double potencia (double x, double y) // Correcto

double potencia (double x, y) // Error de sintaxis


Parámetros formales y parámetros reales.


  • Parámetros formales: Los que se definen en la cabecera de la función.
  • Parámetros reales: Los que aparecen en la llamada a la función. Deben corresponderse con los parámetros formales definidos en la cabecera.






public static void main(String [] args)

{

int k = 3;

boolean flag = true;

// Llamadas correctas:

f(7, false);

f(0, flag);

f(k, flag);

// Llamadas inCorrectas:

// No concordancia entre parámetros reales y formales

f(true, d, flag);

f(false, 7);

}


El tipo retorno de un método puede ser cualquier tipo válido en el lenguaje, incluso los creados por el programador.
Un método tambien puede devolver objetos y recibirlos como parámetros.
Siempre hay que especificar un tipo de retorno del método, aunque queramos que este se comporte como un procedimiento (en cuyo caso no sería necesario), en este caso se pondrá como tipo de retorno void (que indica que no se devuelve nada).
El valor de retorno se determina (dentro del método) mediante la sentencia return. Se escribe return acompañado del valor a devolver cuando es una "función", y return "a secas" seguido de ; cuando se comporta como un "procedimiento".
El método en cuestión termina en cuanto se encuentre el primer return, sin continuar hasta el final del código de este.
Una curiosidad del lenguaje a destacar es que no se pueden pasar tipos simples como parámetros por referencia directamente, sino que hay que hacerlo como si un objeto se tratase gracias a las clases propias de Java que engloban cada tipo simple.


Procedimientos y funciones.


Se suele distinguir entre funciones y procedimientos:

Las funciones se corresponden con la noción matemática de función: producen un resultado que es función de los datos de entrada:

• y = f(x1, x2,...xn)

• Una función bien definida no modifica los parámetros de entrada.

• Se utilizan en expresiones.

Los procedimientos agrupan sentencias que realizan una tarea bien definida, pero no tienen por qué devolver un resultado.

• Se corresponden con el concepto de instrucción.

• Los procedimientos actúan sobre el entorno y pueden modificar los parámetros de entrada (efectos colaterales)

Los procedimientos pueden verse como una forma de extender las sentencias del lenguaje, mientras que las funciones pueden verse como una extensión de los operadores:

• Cuando se invoca una función se obtiene un valor a través de un valor de retorno.

• Cuando se invoca un procedimiento el efecto es una modificación del entorno del llamante, de la cual éste es advertido a través de los valores de los parámetros de salida.




Métodos de paso de parámetros.

Los parámetros de los métodos se pueden pasar por valor o por referencia.

En Java, los tipos primitivos siempre se pasan por valor y los objetos siempre por referencia.

Esto también ocurre para las variables de la sentencia return.



Ejemplo de paso por valor en Java:


void intercambio(int x, int y)

{

int auxiliar;

auxiliar = y;

y = x;

x = auxiliar;

}


Paso de arrays como parámetros en Java.


Los arrays son objetos y por tanto se pasan por referencia.

• La referencia se pasa por valor

• Para pasar un array como parámetro escribimos el nombre del array en la lista de parámetros (sin corchetes)

int temperaturasHorarias[] = new int[24];

modificarArray(temperaturasHorarias);

• El nombre del array es en realidad una referencia a un objeto que contiene los elementos del array.



class Paso_Arrays_1

{

static int a[] = {0, 1, 2, 3, 4};

public static void modificarArray(int b[])

{ // Por referencia

for (int j = 0; j<>

}

public static void modificarElemento(int e)

{ // Por valor

e *= 2;

}

public static void main(String [] args)

{

modificarArray(a); // después de llamada a = {0, 2, 4, 6}

modificarElemento(a[3]); // después de llamada a[3] = 6;

}

}


Sobrecarga de métodos en Java.


Sobrecarga de métodos: Java permite definir métodos con el mismo nombre siempre que difieran en los argumentos de entrada. Es una manera de aportar polimorfismo


  • Un método se distingue del resto por su firma.
  • Firma del método: nombre + argumentos de entrada.
  • Puesto que los métodos sobrecargados tienen el mismo nombre, los métodos sobrecargados se diferencian por el número, tipo y orden de los argumentos en su lista de parámetros.

Ejemplo:

public class utilidadesMatematicas

{

int square(int x) { return x*x; }

double square(double x) { return x*x; }

}


  • El prototipo de un método es la firma más el tipo devuelto.


Los métodos sobrecargados no se distinguen por el prototipo sino por la firma.