jueves, 11 de enero de 2007

Abstracción Funcional

Las funciones se invocan para realizar una tarea, pero sin necesidad de saber cómo la llevan a cabo.
Una función es un subprograma con un nombre determinado, que realiza una tarea específica cuando es invocado y opcionalmente devuelve un resultado.
Las funciones usan una lista de parámetros que define:

  • Los datos que el llamante de la función pasa a la misma.
  • Los datos que la función devuelve al llamante (excepto el resultado).

Las funciones se utilizan como elemento de abstracción porque su comportamiento puede ser separado de su implementación.
La abstracción funcional está estrechamente ligada a las técnicas de diseño funcional descendente y a la programación estructurada.
La abstracción funcional permite llevar a cabo el concepto de modularidad:

  • Una función agrupa a un conjunto de instrucciones altamente cohesionadas.
  • Una función realiza una tarea específica.
  • Para usar una función no es necesario conocer su implementación.

Las funciones similares se agrupan en bibliotecas (clases en Java).
Los lenguajes de programación suelen proporcionarse con un conjunto estándar de bibliotecas en las que se definen funciones de uso común.

Abstracción Funcional en Java

La abstracción funcional en Java se consigue mediante métodos, que se encapsulan en clases.
Método: Módulo de una clase que lleva a cabo una determinada funcionalidad según los parámetros pasados y devolviendo un resultado si es necesario.
Parámetros: Producen modificaciones en el resultado o efectos del módulo según su valor. Los tipos primitivos se pasan siempre por valor, los objetos siempre por referencia.
Resultado: Devuelve información derivada de la funcionalidad del módulo. Los tipos primitivos se pasan siempre por valor, los objetos siempre por referencia.

Sobrecarga: Permite invocar distintos módulos con la misma llamada según el número o tipo de los parámetros de entrada.
Polimorfismo: Permite a un módulo aceptar parámetros de distintos tipos siempre que implementen una interfaz común.
Genericidad: Permite aplicar un módulo a distintos tipos de datos.

Recursividad: Produce métodos muy potentes con escasas líneas de código.

Abstracción Funcional en Pascal

La abstracción funcional consiste en crear procedimientos y funciones e invocarlos mediante su nombre, teniendo en cuenta únicamente lo que realiza y no como lo realiza.

Subprograma: Módulo que realiza una tarea determinada. Suelen ser llamadas a funciones o procedimientos.
Función: Calcula un resultado y lo devuelve (La función debe ser de un tipo de datos determinado, que será el tipo de datos del resultado obtenido).
Procedimiento: Realiza una tarea específica sin devolver nada.

Al invocar los subprogramas se les pueden pasar parámetros.
Parámetros actuales: Son los que aparecen en la invocación de un módulo.
Parámetros formales: Son los que aparecen el la declaración de un subprograma.
Paso de parámetros por valor: Se consideran variables locales (se crea una copia), por lo que los cambios realizados en el parámetro no afectan al valor del parámetro actual).
Paso de parámetros por referencia: Se consideran variables globales, por lo que los cambios en el parámetro afectarán al valor del parámetro actual.

Recursividad: Esto se consigue llamando a un subprograma desde el mismo subprograma, pero en cada llamada los parámetros actuales son distintos.
Sobrecarga: Para hacer una sobrecarga de funciones hay que declarar dos o más funciones con el mismo nombre pero cambiando los parámetros (sino daría error de compilación).

Diferencias


  • Java no utiliza ni procedimientos ni funciones, sin embargo aporta otro mecanismo más potente que son los métodos.
  • En Java todo método es dependiente de una clase, no se permiten funciones ni datos globales como en Pascal.
  • La colisión de nombres desaparece dependiendo del lugar de declaración del dato, ya que si pertenecen a paquetes diferentes no se producida dicha colisión. Sin embargo en pascal no existe ningún truco para solucionarlo.
  • Java permite el retorno de datos complejos en los métodos, mientras que pascal no.
  • La comprobación de tipos, en los métodos de Java se realiza en tiempo de ejecución mientras que en pascal se hace en tiempo de compilación. Debido a esto es necesario escribir prototipos de función/procedimiento en Pascal.
  • La sobrecarga de métodos en Java esta siempre sujeta a cambios en los parámetros formales, aunque se haya modificado el tipo devuelto. Pascal solo necesita modificar el tipo devuelto.
  • Java aporta polimorfismo dinámico y estático, además de la sobrecarga de métodos. Pascal solo aporta polimorfismo de funciones(sobrecarga de funciones)
  • En Pascal puedes declarar funciones anidadas mientras que en Java no.

Similitudes


  • Las funciones pueden ser sobrecargadas en ambos lenguajes.
  • Hay sobrecarga de operadores similares (operador “+”).
  • Ambos permiten pasarle parámetros a las funciones o procedimientos.
  • El comportamiento de las funciones es igual en ambos lenguajes.
  • En ambos se pueden producir efectos laterales por no usar adecuadamente las variables globales y locales.