Escuela Superior de Ingeniería Informática || Lenguajes de Programación

jueves, enero 11, 2007

Abstracción funcional en JAVA y Pascal

El concepto de abstracción funcional consiste en identificar subproblemas menores para solucionar un gran problema, simplificando el análisis y la resolución del mismo.
JAVA
Java lo plantea de la siguiente manera, todos sus datos son objetos de una clase determinada. Al crear una clase especificamos e implementamos que características posee (atributos) y que funciones realiza (métodos), es lo que se conoce como encapsulamiento. Al crear un objeto de esa clase podemos trabajar con él, porque sabemos qué funciones realiza y cuales son los resultados que obtiene pero desconocemos cómo los hace porque realmente no nos interesa.
Con la abstracción funcional logramos los conceptos de encapsulamiento y ocultamiento. El ocultamiento es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer sólo los detalles que sean necesarios para el resto del sistema.
PASCAL
En la programación estructural, la abstracción funcional se puede definir como la capacidad de examinar algo sin preocuparse de los detalles internos, es decir, en un programa estructurado es suficiente conocer que un procedimiento dado realiza una tarea específica, sin necesidad de saber cómo lo hace, mientras el procedimiento sea fiable se puede utilizar sin tener que conocer cómo funciona su interior.

En dicha programación usamos los procedimientos para llegar a ciertos niveles de abstracción, los cuales nos facilita el desarrollo de aplicaciones, ocultando los detalles internos de la implementación tras un identificador (el nombre de la función).
También utilizamos las funciones como herramientas de abstracción (separación), porque su comportamiento puede ser separado de su implementación.
Similitudes
  • Ambos lenguajes soportan la sobrecarga de funciones, dos funciones con el mismo nombre se diferencian en el número de parámetros o el tipo de parámetros que se le pasa, no por el tipo que devuelve. Esto es la base del comportamiento polimórfico.
  • El uso de argumentos por defecto no es soportado por ninguno de los dos lenguajes.
Diferencias
  • A diferencia de JAVA, Pascal soporta variables globales, es decir, su valor está disponible tanto en el cuerpo del programa principal como en el de cualquiera de los subprogramas declarados. En los subprogramas no es aconsejable utilizar las variables globales, puesto que provoca efectos laterales, los cuales se pueden evitar usando los parámetros en la comunicación de un programa con sus procedimientos.
  • Java no tiene procedimientos, solo disponemos de funciones, es decir, los métodos de una clase siempre deben devolver un valor. Podemos simular un procedimiento mediante la palabra reservada ‘void’ (no devuelve ningún valor), como resultado obtenido en una función sin embargo, en Pascal se pueden utilizar tanto funciones como procedimientos, con la diferencia de que las funciones devuelven un único valor y los procedimientos son subprogramas que realizan una tarea específica, pero no devuelven nada.
  • Pascal permite parámetros de entrada (para funciones, ya que en una función los parámetros de entrada nunca van a ser modificados), salida y entrada/salida. En el caso de los procedimientos pueden ser de cualquiera de los 3 tipos, en cambio, en JAVA, debido a la única existencia de las funciones, sólo tienen sentido los parámetros de entrada, porque en una función se obtiene un resultado, no se modifican los datos.
  • Pascal permite el paso de parámetros por valor y por referencia en los procedimientos y funciones. En el paso por valor, el valor del dato no sufre ningún cambio al salir de la función o procedimiento, sin embargo el paso por referencia supone que cualquier cambio hecho en el procedimiento provoca un cambio en el valor de la variable. La palabra reservada VAR indica que el parámetro se pasa por referencia.
  • En Java el paso de parámetro es siempre por valor, aunque los efectos son de paso por referencia cuando los argumentos son objetos, la referencia a un objeto se pasa por valor a la función. Dentro de la función, desde esta referencia podemos acceder a los miembros públicos de dicho objeto para modificar su estado. Cuando la función retorna el objeto estará modificado.