Buscar
Social
Ofertas laborales ES
jueves
nov012001

Programacrión orientada a objetos en Java


Java y la Programación Orientada a Objetos





Introducción.





En este capitulo revisaremos de forma breve algunas características de Java en relación a la programación orientada a objetos. Como mencionamos anteriormente, Java es un lenguaje de programación relativamente joven, a pesar de ello, desde su aparición hasta nuestros días, su crecimiento ha sido vertiginoso, esto se debe en gran parte a la naturaleza misma del lenguaje que ha permitido a los creadores de Java añadir al lenguaje grupos de clases que pueden ser fácilmente adaptadas a las necesidades del desarrollador de software. A estos grupos de clases se les conoce comúnmente como APIs, y los hay para diferentes propósitos que van desde la implementación de una interfaz grafica para el usuario, como sería Swing Set, hasta la conectividad de bases de datos, como es el caso de JDBC (Java Data Base Conectivity). Sin embargo, para los propósitos del presente proyecto, nosotros nos limitaremos a revisar brevemente las características de Java como lenguaje orientado a objetos, es decir revisaremos la forma en que Java implementa las clases, los objetos, la herencia, etc.





Origen de Java.




El lenguaje de programación Java fue inventado por Sun Microsystems, empresa líder en servidores para Internet. En un momento de su historia, Sun decidió entrar al mercado de los electrodomésticos y desarrollar pequeños programas para los mismos, lo que resultó en la creación de la filial FirstPeterson Inc. Las televisiones interactivas, las microondas, son ejemplos del mercado que pretendía cubrir esta nueva empresa.



James Gosling, el miembro de este equipo con más experiencia en lenguajes de programación había notado la necesidad de desarrollar un lenguaje de programación que cubriera las necesidades que la empresa requería, tales como fiabilidad de código, robustez, y facilidad de desarrollo, para Gosling, las ventajas de C++ no justificaban los costos de pruebas y depuración requeridas por éste lenguaje.



En un intento por remediar las deficiencias que había notado en lenguajes como C y C++, Gosling decidió crear su propio lenguaje de programación llamado Oak, e introducirlo en la empresa. El primer proyecto en el que se aplicó este lenguaje fue un sistema completo de control de aparatos electrodomésticos en el hogar denominado Star Seven. Otros proyectos fueron realizados después de Star Seven, tales como sistemas de televisión interactiva, pero ninguno de trascendencia comercial para Sun, lo que obligó a FirstPeterson a cerrar sus puertas en 1994.



Bill Joy, uno de los desarrolladores principales del Unix de Berkeley y cofundador de Sun, vio en Oak el lenguaje de programación adecuado para conquistar el creciente campo del Internet. Después de algunos ajustes en el diseño y un cambio de nombre, se presenta públicamente en agosto de 1995 el lenguaje de programación Java.





Características de Java.





Pueden mencionarse muchas características de Java, sin embargo para los propósitos del presente proyecto mencionaremos sólo las más significativas para la implementación del mismo:






  • Orientado a Objetos.
  • Robusto.
  • Independiente de plataforma.
  • Multitarea.




Orientado a Objetos.





Java soporta las características esenciales del paradigma de la programación a objetos: encapsulación, herencia y polimorfismo. Java hace uso de la definición de entidades formadas por métodos y variables que reciben el nombre de clases, la instancia de alguna clase cualquiera en Java recibe el nombre de objeto.





Robusto.



Java elimina el uso de apuntadores para referenciar localidades de memoria, Java además libera al desarrollador de la necesidad de desalojar la memoria que la aplicación ya no usa, aunado a esto Java requiere la declaración explicita tanto de los tipos de datos como de métodos. Estos factores que acabamos de mencionar, destacan como causas comunes de errores lo que resulta en aplicaciones poco fiables. Al implementar una aplicación en Java se reduce el porcentaje de errores ocasionados por las causas antes mencionadas lo que da como consecuencia programas más robustos y confiables. Es importante mencionar que Java verifica que no haya problemas tanto en tiempo de ejecución como en tiempo de compilación. Finalmente Java hace uso de excepciones para notificar al usuario acerca de las fallas que puedan encontrarse en el sistema y recuperar dicho sistema.





Independiente de plataforma.



Mientras que en lenguajes de programación como C++ existe la necesidad de recompilar el código fuente cada vez que se cambia de plataforma, Java ofrece la posibilidad de que los archivos que son generados para una aplicación sean independientes de plataforma, es decir, que se compilen una vez y se ejecuten en cualquier plataforma. Esto es posible gracias a que las aplicaciones hechas en Java generan archivos conocidos como bytecode. Estos archivos no corresponden a algún procesador o sistema operativo en particular, digamos Intel o Motorola, Unix o Windows, sino que al momento de ser ejecutados un interprete propio de cada plataforma interpreta el bytecode al correspondiente sistema y procesador en el cual se esta ejecutando. Cada plataforma (Macintosh, Windows, Linux, etc) tiene su propio interprete de Java, pero el archivo bytecode es el mismo para todas las plataformas.





Multitarea.




A pesar de que las capacidades de multitarea que pueden ser implementadas en Java dependen en gran parte del sistema operativo en el cual se ejecuten, digamos Windows o Unix, dichas capacidades superan en gran manera a los entornos de flujo único (single-thread) que ofrecen otros lenguajes de programación. Al ser multitarea Java permite la ejecución concurrente de varios procesos ligeros o hilos de ejecución.




Clases en Java.



El elemento básico de la programación orientada a objetos en Java es la clase. Las clases en Java definen las entidades que conformarán la aplicación. Una clase es definida por medio de variables y métodos.



En Java todo elemento o es parte de una clase o bien es una clase o bien describe el funcionamiento de una clase.



Supongamos, únicamente para propósitos de ejemplo, que queremos implementar una aplicación que utiliza objetos puntos con componentes x y y que pueden desplazarse tales puntos con un radio constante de 10 unidades, para poder crear estos objetos, en Java definimos primero el molde Punto de donde posteriormente podemos instanciar los objetos requeridos. El siguiente código puede ser una solución a éste problema:




class Punto
{

int x;
int y;
static int radio = 10;

Punto (int a, int b)
{
x= a;
y= b;
}

void desplazarX(int t)
{
x= x + t;
}

void desplazarY (int h)
{
y = y + h;
}
}


Los atributos de la clase en este caso son: x y y. El comportamiento de esta clase se define en los métodos desplazarX, desplazarY. El seudo método Punto, recibe el nombre de constructor y es utilizado para inicializar valores de los atributos de una clase.



En Java, todas las clases son por omisión derivadas de una clase madre llamada Object. Las clases pueden ser de tipo: public, lo que significa que son accesibles desde otras clases; abstract, las cuales definen sus métodos pero no los implementan sino que son utilizadas para servir como clases madres a otras clases que se crean a partir de estas; final, las cuales ya no pueden ser clases madre para ninguna subclase; synchronizable, las clases de este tipo especifican que sus miembros (variables y métodos) no pueden ser accesados desde diferentes tareas al mismo tiempo, lo que evita que haya sobre escritura de datos.



Los miembros de una clase pueden ser definidos de dos formas, de instancia y de clase. Si una variable es definida como variable de instancia significa que cada vez que se instancie un objeto de dicha clase, el objeto puede contener cualquier valor para dicha variable. Retomando el ejemplo anterior, si creamos diferentes instancias de la clase punto, cada instancia puede tomar valores diferentes para sus variables x y y. En Java, por omisión todos los miembros de una clase son de instancia. Si es necesario que un componente del objeto no cambie sino que permanezca constante para todos los objetos del mismo tipo, es conveniente declararlo como un miembro de clase, en el ejemplo anterior vimos que todos los puntos creados tenían el radio constante, en este caso definimos la variable radio como variable de clase, en Java un miembro clase se define por medio de la palabra reservada static.




Objetos en Java.




Como hemos venido mencionando, en Java el componente principal para implementar la orientación a objetos es la clase, la clase es el molde o prototipo de donde se instancian los objetos. El objeto es entonces, un caso particular de la clase.



Revisemos nuevamente el ejemplo que hemos estado trabajando en este capitulo, supongamos que necesitamos instanciar dos objetos punto para una cierta aplicación, en Java esto puede hacerse de la siguiente manera:



. . .
Punto p0 = new Punto(5,10);
Punto p1 = new Punto(6,12);
. . .


En este caso los objetos p0 y p1 son instancias de la clase Punto, cada cual con valores diferentes en sus variables de instancia: x y y, con el mismo valor en su variable de clase: radio y con las mismas capacidades de comportamiento desplazarX y desplazarY.



Una vez que se ha creado un objeto, se pueden modificar sus miembros de la siguiente manera:



. . .
p1.desplazarX(15);
. . .


Este caso, modificamos el componente x del objeto p1 haciendo un llamado al método desplazarX con el valor 15, lo que da por resultado añadir 15 unidades al valor de la variable x, únicamente del punto p1.



La creación de un objeto en Java se realiza de acuerdo a los siguientes puntos:





  • Declaración. Nombre del objeto.
  • Instanciación. Asignación de memoria al objeto.
  • Inicialización. Opcionalmente, asignar valores iniciales al objeto.





Herencia.



En Java una clase puede definirse como la extensión de una clase madre y a su vez esta clase puede servir como clase madre para que otras subclases deriven de ésta misma.



Veamos un ejemplo, supongamos que necesitamos definir objetos puntos muy semejantes a los que hemos definido en el ejemplo anterior pero que además tengan otras propiedades, digamos peso y color y que se desplacen las mismas unidades tanto en x como en y, tenemos dos opciones, una sería construir otra clase totalmente nueva que tenga una implementación muy similar a la de la clase Punto pero además agregue los nuevos miembros, opción que no es muy recomendable puesto que es trabajar sobre algo que ya hemos hecho, o bien crear una nueva clase partiendo de la clase Punto. El siguiente código nos muestra una forma de implementar esta nueva clase a la que llamaremos PuntoPC que derivará de la clase Punto.




class PuntoPC extends Punto
{

String color;
float peso;

PuntoPC(int a, int b, String c, float p)
{
super (a,b);
color = c;
peso = p;
}

void desplazarAmbos(int d)
{
x= x+d;
y= y+d;
}
}


En este caso, el único comentario adicional sería especificar que el constructor PuntoPC toma los valores iniciales a y b y los pasa a la súper clase Punto y asigna los valores peso y color a sus correspondientes variables.



En java no existe la herencia múltiple como tal, es decir una clase no puede tener mas de una clase madre, sin embargo los beneficios de la herencia múltiple pueden ser implementados mediante el uso de interfaces las que a continuación discutimos.





Interfaces.



De manera informal podemos definir a una interfaz como una clase en la que se declaran métodos y valores constantes, pero no se implementan sino que serán implementados por una clase que, valga la redundancia, implemente dicha interfaz.



Tanto las clases como las interfaces tienen prácticamente el mismo formato general, los siguientes puntos definen las diferencias que existen entre una clase y una interfaz.




  • Una interfaz al igual que una clase abstracta, declara los métodos pero no los implementa.
  • Una clase puede implementar varias interfaces, manteniendo la estructura del lenguaje simple y al mismo tiempo, proveyendo las ventajas de la herencia múltiple.
  • No se pueden instanciar objetos a partir de una interfaz.
  • Todos los métodos de una interfaz son de forma implícita públicos y abstractos.
  • Todas las variables de una interfaz son de forma implícita públicas, estáticas y finales.
  • Cuando una clase implementa una interfaz, debe implementar todos y cada uno de sus métodos, siempre y cuando, la clase no sea abstracta.
  • Una interfaz no tiene una clase padre antecesora (como en el caso de las clases que por omisión tienen a la clase Objet), en vez de eso, las clases tienen una jerarquía independiente que puede ser aplicada a cualquier nivel del árbol de clases.





Resumen.



La precedente discusión no pretende ser de forma alguna un estudio exhaustivo de Java en el contexto de la orientación a objetos, sino simplemente, es una revisión a groso modo de la forma en que el lenguaje de programación Java lidia con los conceptos de objetos, herencia, clases, etc. fundamentales para la comprensión y el desarrollo del presente proyecto.



Así pues, la clase es el concepto fundamental de Java para implementar el paradigma de la tecnología orientada a objetos, por medio de la clase, Java logra modularidad, polimorfismo, herencia y encapsulamiento, determinantes en la concepción de un lenguaje orientado a objetos.





Bibliografía

Agustín Froufe, Java 2 Manual de Usuario y tutorial, Alfaomega, 2000.

Steven W. Griffith. 1001 tips para programar con Java. McGraw-Hill. 1997.

Mary Campione, et al, The Java Tutorial, A short course on the basics. Addison-Wesley. 2000.

Bruce Eckel, Thinking in Java. Prentice Hall. 2000.

Wood, J., Java Programming for Spatial Science, http://www.geog.le.ac.uk/jwo/teaching/javaProg, 1999.
















José Arturo de los Angeles es pasante de la Lic. en Ciencias Computacionales de la Benemérita Universidad Autónoma de Puebla (México).




Para cualquier duda o tirón de orejas, e-mail a:
arturoas7_ARROBA_yahoo.com




jueves
nov012001

Introduccrión a Java Web Start

Introducción a Java Web Start




¿Que es Java Web Start?




Java Web Start es un gestor de aplicaciones basadas en Java(TM), en
concreto, en Java 2(TM).
Es como si fuera un motor de applets que funciona con independencia del
navegador.



Esta aplicación se encargará de gestionar aplicaciones java como si se
tratará de un navegador gestionando páginas, es decir, se encargará de
cachearlas, hacer las correspondientes comprobaciones de seguridad, etc.
Las aplicaciones se encontrán en servidores web y se ejecutarán en Java Web
Start.



Podemos descargarnoslo, ver ejemplos, y participar en el foro de Java Web
Start en:




http://java.sun.com/products/javawebstart/





Características






  • Está hecho en java, con lo se podrá instalar con independencia del sistema
    operativo. Aun así, hay distintos ficheros e instrucciones de instalación
    para cada sistema operativo.
  • Es independiente del navegador. Funcionará en Explorer, Navigator, o
    cualquier otro.
  • Mantiene la seguridad de los applets de Java, es decir, no permitirá que
    ninguna aplicación acceda a recursos de nuestra máquina ni se conecte con
    otras sin nuestro permiso.
  • Incorpora librerías que permiten el uso algunas ventajas de los
    navegadores sobre los applets, como son el uso de cookies y la creación de
    dialogos de selección de ficheros, por ejemplo.
  • Gestiona la descarga de las aplicaciones y permite su fragmentación, con
    lo que, una vez que nos bajemos una aplicación, ya no nos la tendremos que
    descargar hasta que se modifique alguno de sus módulos (ficheros jar) en el
    servidor web.
  • Es para Java 2, con lo que podremos utilizar swing y otras características
    sin tener que instalar un plug-in ni nada parecido.
  • Permite seleccionar la máquina virtual java que ejecutaremos, con lo que
    podremos tener varias instaladas.
  • Necesita ser instalado en la máquina cliente. Esta es su principal
    desventaja, aunque el fichero de instalación solo son unas 800 K, hay que
    instalarse también alguna máquina virtual java (JRE).
  • El entorno está escrito en varios idiomas, y se detecta automáticamente.
    Podremos ver el entorno en castellano si éste es el idioma de nuestro
    sistema.





Funcionamiento



Las aplicaciones hechas para esta aplicación se encontrarán en servidores
web y se ejecutarán por medio de enlaces puestos en páginas HTML. De esta
manera, igual que cuando un navegador llama a una imagen gif o jpg, la
muestra, al llamar a un fichero Java Web Start, que tienen extensión .jnlp
la ejecutará sobre la aplicación Java Web Start.



Java Web Start se ejecuta sobre una máquina virtual java como una aplicación
de ventanas hecha con swing.



Una vez cargadas las aplicaciones, podremos ejecutarlas sin necesidad de
abrir el navegador. Ejecutando la aplicación Java Web Start, se nos mostrará
una lista con las aplicaciones y se nos dará la opción de ejecutarlas.





Requisitos



Antes de instalar la aplicación deberíamos tener instalada alguna máquina
virtual java. Podemos usar la que viene con herramientas como JBuilder,
Visual Cafe, Visual Age, Bolero, JDK, o instalarnos el JRE. La versión
tendrá que ser la 1.2 o posterior.



Tendremos que configurar el navegador para que ejecute los ficheros con
mime-type "application/x-java-jnlp-file" con Java Web Start.
El servidor web donde se encuentre la aplicación tendrá que devolver los
ficheros con extensión .jnlp con este mime-type. Por ejemplo, en apache,
tendriamos que añadir la linea



application/x-java-jnlp-file jnlp


al fichero mime.types del directorio de configuración.





Cómo crear aplicaciones.



La aplicación Java Web Start consta de una aplicación para Java2 en uno o
varios ficheros jar y un fichero jnlp donde se pondrán las características
de la aplicación (icono, nombre, etc) y dónde se encuentran los ficheros
jar.



El fichero jnlp es un documento XML, con lo que podrá editarse con cualquier
editor de texto.



En la página HTML desde donde se ejecutará el programa podremos poner un
enlace de la siguiente forma:



<a href="Aplicacion.jnlp">Ejecutar</a>















Juan Carlos Garcinuño




Para cualquier duda o tirón de orejas, e-mail a:
xgarcinuno_ARROBA_hotmail.com




jueves
nov012001

Introduccrión a la programacrión orientada a objet


Programación Orientada a Objetos







Introducción a la programación orientadas a objetos.






La tecnología orientada a objetos se define como una metodología de diseño de software que modela las características de objetos reales o abstractos por medio del uso de clases y objetos[1]. Hoy en día, la orientación a objetos es fundamental en el desarrollo de software, sin embargo, esta tecnología no es nueva, sus orígenes se remontan a la década de los años sesenta. De hecho Simula, uno de los lenguajes de programación orientados a objetos más antiguos, fue desarrollado en 1967.




Objeto: Una unidad de software conformada por atributos y métodos específicos.



El objeto, es el concepto principal sobre el cual se fundamenta la tecnología orientada a objetos. Un objeto puede ser visto como una entidad que posee atributos y efectúa acciones. En el mundo real podemos encontrar cientos de ejemplos que cumplen con ésta definición, algunos de ellos son: una bicicleta, un automóvil, una persona, una computadora, etcétera.



Estos objetos son casos particulares de entidades llamadas clases en donde se definen las características comunes de tales objetos. Veamos el caso particular del objeto automóvil, podemos mencionar como atributos de éste: el modelo, el color, la marca, el número de placas, entre otros. Algunas acciones que es capaz de realizar un automóvil son: ir en reversa, virar, frenar, acelerar y cambiar la velocidad. Este objeto automóvil, es una instancia particular de la entidad automóvil. En términos de la programación orientada a objetos, se dice que todo objeto tiene un estado (atributos) y un comportamiento (acciones). La programación orientada a objetos nos permite modelar estos objetos del mundo real en objetos de software de forma eficaz. Un objeto de software mantiene sus atributos o estado en variables e implementa las acciones o comportamientos por medio de métodos o funciones. Supongamos que queremos desarrollar una aplicación que simule un vehículo. Tendríamos entonces un objeto vehículo constituido por



variables en las cuales podríamos almacenar número de serie, color, la velocidad actual, etcétera. Aunado a esto, tendríamos un conjunto de funciones que implementaran las acciones para frenar, virar, cambiar la velocidad, etcétera.




Clase: Es un molde o bien prototipo en donde se definen los atributos (variables) y las acciones (métodos) comunes de una entidad.



Este es el paradigma que propone la programación orientada a objetos, la abstracción de los elementos que constituyen a un objeto del mundo físico, esto es, atributos y comportamiento, y la representación de éstos elementos por medio de objetos de software formados por variables y métodos que permitan la manipulación de tales variables. Cabe mencionar que además de representar los objetos físicos del mundo real por medio de objetos, también podemos modelar objetos abstractos, por ejemplo las acciones de un usuario al interactuar con la maquina. Como observaremos más adelante, algunas de las ventajas de la tecnología orientada a objetos son la reutilización de objetos, y la facilidad de comprensión de los programas.



Bases sobre las cuales se fundamenta la programación orientada a objetos.



Los elementos más importantes que deben tener los objetos de software, para cumplir con el paradigma de orientación a objetos son:




  • Abstracción.
  • Modularidad.
  • Encapsulamiento.
  • Jerarquía.
  • Polimorfismo.




Abstracción.



La abstracción es el proceso en el cual separamos las propiedades más importantes de un objeto, de las que no lo son. Es decir, por medio de la abstracción definimos las características esenciales de un objeto del mundo real, los atributos y comportamientos que lo definen como tal, para después modelarlo en un objeto de software.



En el proceso de abstracción no debemos preocuparnos por la implementación de cada método o atributo, solamente debemos definirlo de forma general. Por ejemplo, supongamos que deseamos escribir un programa para representar el sistema solar, por medio de la abstracción, podemos ver a éste sistema como un conjunto de objetos, algunos de estos objetos son los planetas, que tienen un estado, dado por sus características físicas, digamos, tamaño, masa, entre otras, estos objetos tendrán también comportamientos : la translación y la rotación, pueden mencionarse como los más evidentes.



Visualizar las entidades que deseamos trasladar a nuestros programas, en términos abstractos, resulta de gran utilidad para un diseño optimo de nuestro software, ya que nos permite comprender más fácilmente la programación requerida.



En la tecnología orientada a objetos la herramienta principal para soportar la abstracción es la clase. Podemos definir a una clase como una descripción genérica de un grupo de objetos que comparten características comunes, dichas características se especificadas en sus atributos y comportamientos. En otras palabras, una clase es un molde o modelo en donde se especifican las características que definen a un objeto de manera general, a partir de una clase pedemos definir objetos particulares. En programación orientada a objetos se dice que un objeto es una instancia de la clase, es decir un objeto, es un caso particular del conjunto de objetos que comparten características similares, definidas en la clase.



Un ejemplo servirá para clarificar estos conceptos. Definamos a la clase persona, esta clase tendrá ciertos atributos, por ejemplo edad, sexo y nombre entre otros. Las acciones o comportamientos que podemos definir para esta clase son, por ejemplo, respirar, caminar, comer, etcétera. Estas son, para nuestro caso, las características que definen a nuestra clase persona. Un objeto instanciado de está clase podría ser Juan Pérez, de sexo masculino y de 35 años de edad, quién se encuentra caminando. Estos atributos son conocidos formalmente en programación orientada a objetos como variables de instancia por que contienen el estado de un objeto particular en un momento dado, en este caso Juan Pérez. Así mismo, los comportamientos son llamados métodos de instancia porque nos muestran el comportamiento de un objeto particular de la clase.




Hay que tener cuidado de no confundir un objeto con una clase, una gelatina de fresa y una gelatina de limón son objetos de la misma clase (o del mismo molde), pero con atributos (o sabores) diferentes.





Modularidad.



Dentro de la programación orientada a objetos, la modularidad juega un papel muy importante. Una vez que hemos representado una situación del mundo real en un programa, tenemos regularmente como resultado, un conjunto de objetos de software que constituyen la aplicación. La modularidad, nos permite poder modificar las características de la clase que definen a un objeto, de forma independiente de las demás clases en la aplicación. En otras palabras, si nuestra aplicación puede dividirse en módulos separados, normalmente clases, y estos módulos pueden compilarse y modificarse sin afectar a los demás, entonces dicha aplicación ha sido implementada en un lenguaje de programación que soporta la modularidad. La tecnología orientada a objetos nos brinda esta propiedad para hacer uso de ella en el software que desarrollemos.





Encapsulamiento.



También referido como ocultamiento de la información, el encapsulamiento es la propiedad de la orientación a objetos que nos permite asegurar que la información de un objeto le es desconocida a los demás objetos en la aplicación. Es muy frecuente referirse a los objetos de software como cajas negras, esto se debe principalmente a que no necesitamos, dentro de la programación orientada a objetos, saber como esta instrumentado un objeto para que este interactúe con los demás objetos. Generalmente una clase se define en dos partes, una interfaz por medio de la cual los objetos que son instanciados de la misma interactúan con los demás objetos en la aplicación, y la implementación de los miembros de dicha clase (métodos y atributos). Retomando dos de los ejemplos anteriores, supongamos que deseamos realizar una aplicación en donde deben interactuar el objeto Mercedes Benz, instancia de la clase automóvil y el objeto Juan Pérez, instancia de la clase Persona. Ambos objetos pueden ser vistos como cajas negras las cuales se comunican por medio de una interfaz. El objeto Mercedes no sabe como esta implementado el objeto Juan Pérez y viceversa. Concretamente, el encapsulamiento permite a un objeto ocultar información al mundo exterior, o bien restringir el acceso a la misma.



Una aplicación orientada a objetos esta constituida, como mencionamos anteriormente, por módulos. Estos módulos se implementan mediante clases, las cuales representan, generalmente, abstracciones de objetos del mundo real. Es por medio del encapsulamiento que podemos definir los atributos y los métodos de una clase para que los objetos que se instancian de ésta trabajen como unidades independientes de los demás objetos con los que interactúan. En otras palabras, con el encapsulamiento ganamos modularidad, y además protegemos a los objetos de ser manipulados de forma inadecuada por objetos externos.





Jerarquía



Una vez que hemos definido una clase, por ejemplo la clase bicicleta, con sus atributos y métodos, tal vez necesitemos definir una nueva clase específica para las bicicletas de carreras. Es obvio que ésta nueva clases compartirá elementos en común con la clase bicicleta, es decir, la clase bicicleta de carreras será un subconjunto de la clase bicicleta.



La tecnología orientada a objetos nos permite definir jerarquías entre clases y jerarquías entre objetos. Las dos jerarquías más importantes que existen son la jerarquía “es un” que precisa la generalización y especificación entre clases y la jerarquía “es parte de” en la cual se delimita la agregación de objetos.



Comúnmente, a la jerarquía “es un” se le conoce como herencia. La herencia simple es la propiedad que nos permite definir una clase nueva en términos de una clase ya existente. Regresando al ejemplo, si podemos decir que una bicicleta de carreras “es una” bicicleta, entonces podemos definir a la clase bicicleta de carreras a partir de la clase bicicleta. Existirán casos en los cuales se necesite definir una clase a partir de dos o más clases preexistentes, en este caso estaremos hablando de herencia múltiple.



En cuanto a la jerarquía de agregación, también conocida como inclusión, podemos decir que se trata del agrupamiento lógico de objetos relacionados entre si dentro de una clase. Supongamos que tenemos que definir a la clase automóvil, pero además hemos definido ya a la clase volante. Si podemos expresar la oración, un volante “es parte de” un automóvil, entonces podemos instanciar un objeto de la clase volante, para definir a la clase automóvil. En este caso, se dice que automóvil es una agregación y volante es un agregado de automóvil.





Polimorfismo



Muchas veces es necesario que un mismo comportamiento o acción se realice de diferentes maneras, por ejemplo, supongamos que deseamos implementar a la clase mamíferos, supongamos también que uno de los métodos que deseamos implementar para esta clase, es el que permita a tales mamíferos desplazarse de forma natural. Nos encontraremos entonces con que para algunos mamíferos el desplazamiento se realizará por medio de caminar, como es en el caso de las personas, para otros el desplazamiento natural será nadar, como en el caso de los delfines e inclusive para otros, el desplazamiento se logrará por medio de volar, como sucede con los murciélagos. En otras palabras, un mismo comportamiento, en este caso el desplazamiento, puede tomar diferentes formas.



Dentro de la programación orientada a objetos puede modelarse esta situación del mundo real, en objetos de software, gracias al polimorfismo. El polimorfismo es la propiedad por la cual una entidad puede tomar diferentes formas. Generalmente está entidad es una clase, y la forma en que se consigue que tome diferentes formas es por medio de nombrar a los métodos de dicha clase con un mismo nombre pero con diferentes implementaciones.






Taxonomía de los lenguajes orientados a objetos.





Una clasificación para los lenguajes de programación con respecto a la orientación a objetos fue creada por Wegner[2], dicha clasificación se constituye de la siguiente forma:
















Basados en objetosBasados en clasesOrientación a Objetos
Si la sintaxis y semántica de lenguaje soportan las características de objetos que hemos mencionado.Si un lenguaje esta basado en objetos y además soporta clases, se dice que esta basado en clases.Si un lenguaje de programación soporta objetos, clases y además permite la jerarquía de dichas clases, entonces se dice que es un lenguaje de programación orientado a objetos.





Esta clasificación es la que prevalece actualmente, en está se establece claramente que para que un lenguaje de programación sea considerado orientado a objetos éste debe soportar la creación de clases y la herencia.



Java es actualmente uno de los lenguajes de programación, que cumple perfectamente con los requisitos de la orientación a objetos, Delphi, Simula, Smalltalk, son también considerados lenguajes orientados a objetos.



Java puede ser visto como el resultado de una mezcla de C++ y Smalltalk, tiene la sintaxis de C++, lo que lo hace relativamente fácil de aprender, si es que se está familiarizado con C++, una de las características que lo hace más robusto que C++, es que no tiene apuntadores, que son causa común de errores en el desarrollo de aplicaciones con este lenguaje. Como en el caso de Smalltalk , Java tiene recolección de basura, una capacidad que libera al programador de definir funciones de alojamiento y desalojamiento de estructuras en memoria. Más adelante hablaremos de Java dentro del contexto de orientación a objetos con más detalle.




Caractirísticas adicionales de los lenguajes orientados a objetos.



Además de las características que mencionamos anteriormente como esenciales de los lenguajes de programación orientados a objetos , es deseable que éstos cumplan también con las siguientes:



Tipificación fuerte. Esto es, que durante la fase de diseño e implementación se declare que tipo de datos soportara cada variable.



Manejo de excepciones. Dentro de la misma definición del lenguaje se deberá establecer la forma de detectar y manipular excepciones que puedan surgir durante la ejecución de un programa.



Paso de mensajes. Es conveniente que el lenguaje soporte paso de mensajes entre módulos de manera bidireccional.



Generalidad. Se refiere principalmente a que las clases se definan lo más generalizadas posible para que sean fácilmente reusables. Para generar este tipo de clases, normalmente se definen parámetros formales que son instanciados por parámetros reales.



Multitarea. Es conveniente que el lenguaje permita la creación de procesos que se ejecuten de forma simultanea independientemente del sistema operativo.



Persistencia. Los objetos deben poder permanecer, si así se desea, después dela ejecución de un programa.



Datos compartidos. Los objetos pueden necesitar referirse a la misma localidad de memoria (memoria compartida) o bien comunicarse mediante mensajes.





Ventajas de la tecnología orientada a objetos.




Flexibilidad. Si partimos del hecho que mediante la definición de clases establecemos módulos independientes, a partir de los cuales podemos definir nuevas clases, entonces podemos pensar en estos módulos como bloques con los cuales podemos construir diferentes programas.



Reusabilidad. Una vez que hemos definido a la entidad persona para utilizarla en una aplicación de negocios, por mencionar un ejemplo, y deseamos construir a continuación una aplicación, digamos de deportes, en donde requerimos definir a la misma entidad persona, no es deseable volver a escribir la definición para la entidad persona. Por medio de la reusabilidad podemos utilizar una clase definida previamente en las aplicaciones que nos sea conveniente. Es claro que la flexibilidad con la que se definió la clase va a ser fundamental para su reutilización.



Mantenibilidad. Las clases que conforman una aplicación, vistas como módulos independientes entre sí, son fáciles de mantener sin afectar a los demás componentes de la aplicación.



Extensibilidad. Gracias a la modularidad y a la herencia una aplicación diseñada bajo el paradigma de la orientación a objetos puede ser fácilmente extensible para cubrir necesidades de crecimiento de la aplicación.






Desventajas de la tecnología orientada a objetos.



A pesar de que las ventajas de la programación orientada a objetos superan a las limitaciones de la misma, podemos encontrar algunas características no deseables en ésta.



Limitaciones para el programador. No obstante que la tecnología orientada a objetos no es nueva, un gran porcentaje de programadores no están familiarizados con los conceptos de dicha tecnología. En otras palabras, la lógica de la programación estructurada sigue siendo predominante en la mayoría de los desarrolladores de software, después de haber revisado de forma breve los principios de la programación orientada a objetos, nos es claro que en ésta se requiere una lógica de pensamiento totalmente diferente a la lógica comúnmente utilizada para la programación estructurada.



Tamaño excesivo en las aplicaciones resultantes. La gran mayoría de los equipos de computo cuentan con capacidades tanto de almacenamiento como de memoria lo suficientemente buena como para ejecutar la mayoría de las aplicaciones que puedan desarrollarse con la tecnología orientada a objetos, sin embargo existen casos en los que lo anterior no se cumple. Una de las desventajas de la programación orientada a objetos es que cuando se heredan clases a partir de clases existentes se heredan de forma implícita todos los miembros de dicha clase aun cuando no todos se necesiten, lo que produce aplicaciones muy grandes que no siempre encajan en los sistemas con los que se disponga.



Velocidad de ejecución. Esto tiene que ver, en cierto modo, con el punto anterior, una aplicación innecesariamente pesada en muchas ocasiones es más lenta de ejecutar que una aplicación conformada únicamente por los módulos necesarios.





Resumen.





A manera de conclusión podemos decir que la tecnología orientada a objetos nos permite diseñar e implementar sistemas bajo un paradigma de programación en el cual, por medio de la abstracción definimos a las clases o entidades de software a partir de entidades del mundo real. De dichas entidades instanciaremos objetos de software que se corresponderán con los objetos reales que representan. Esto nos permite enfocarnos más en la solución del problema que en la implantación de dicha solución.




Ledbetter y Cox[3] lo establecen de la siguiente manera:




La programación orientada a objetos permite una representación más directa del modelo del mundo real en el código. El resultado es que la radicalmente transformación normalmente llevada a cabo de los requisitos del sistema (definido en términos de usuario) a la especificación del sistema (definida en términos de computadora) se reduce considerablemente.





[1] The Java Tutorial.

[2] Joyanes, Programación orientada a objetos, pág. 28, Mc Grow Hill 1998.

[3] Luis Joyanes A. Programación Orientada a Objetos, página 18. Mc Grow Hill, 1998.
















José Arturo de los Angeles es pasante de la Lic. en Ciencias Computacionales de la Benemérita Universidad Autónoma de Puebla (México).




Para cualquier duda o tirón de orejas, e-mail a:
arturoas7_ARROBA_yahoo.com




jueves
nov012001

Documentar con javadoc


JavaDoc. Comentando el código fuente.


Este artículo es el inicio de una serie de ellos dedicados a aprender
cómo comentar el código Java y cómo generar la documentación
HTML de nuestras API's mediante la herramienta de generación automática
Javadoc.

Como mi mentor en Java me dijo una vez, el buen código en Java
se comenta solo y no le falta razón. Por eso, aquí vamos
a aprender que no es necesario comentar todas las líneas de código
(salvo algún caso excepcional que requiera ser remarcado por su
importancia). Realmente lo único necesario es comentar la clase
y cada uno de los métodos que empleemos, bien para quien quiera
entender qué hace esa clase o la función que desenpeñan
cada uno de los métodos o bien, como es la intención de este
artículo para que luego la herramienta de generación automática
de documentación nos cree la nuestra.

En este primer artículo nos dedicaremos a aprender cómo
se comentan las clases y las etiquetas que disponemos para añadir
información adicional.

 


Tipo de comentario para generar la documentación.


A parte de los ya sabidos /* */ ó //, también tenemos un
tercero propio de java y que es el que usa el javadoc como delimitador
para reconocer la documentación que tiene que generar. Cualquier
comentario de este tipo debe comenzar por el delimitador /** y,
luego, cada línea de comentario que añadamos debe seguir
al operador *. Así mismo, también comenzarán
por un * las etiquetas, sólo que éstas a su vez deben ser
precedidas por el operador @ como se verá en el próximo

capítulo.

Una cosa muy importante que quiero resaltar ya es que javadoc lo único
que hace es copiar el contenido a una página HTML por lo que se
admite cualquier etiqueta HTML que queráis para darle más
claridad o vistosidad a vuestra documentación. Vemos a continuación
el formato típico de un comentario al estilo javadoc.

/**
* Al usar este estilo de comentario estoy consiguiendo que cuando
* lo pase por javadoc, esta herramienta copie este texto a una página
* html.
* Puedes ver que  también admite <b>etiquetas HTML</b>
* y ésto último que acabo de escribir aparecerá en negrita.
*/



Las etiquetas.


 Aparte de los comentarios propios, la utilidad javadoc nos proporciona
una serie de etiquetas para completar la información que queremos
dar de una determinada clase o método. Son las siguientes:

 @author nombre (desde la versión 1.0 del
JDK/SDK)

 Indica el autor de la clase en el argumento nombre. Un
comentario de este tipo puede tener más de un autor en cuyo caso
podemos usar tantas etiquetas de este tipo como autores hayan colaborado
en la creación del código fuente o bien podemos ponerlos
a todos en una sola etiqueta. En éste último caso, Javadoc
inserta una (,) y un espacio entre los diferentes nombres.

 

 @deprecated comentario (desde la versión
1.0 del JDK/SDK)

Añade un comentario indicando que este API no debería
volver a usarse, aunque aun siga perteneciendo a la distribución
del SDK que estemos utilizando, por estar desautorizado o "desfasado".
No obstante, ésto es sólo una advertencia que nosotros damos
a los usuarios de nuestras API's, al igual que las distribuciones de Sun
hacen con nosotros. Realmente, lo que estamos haciendo al decir que una
determinada API está desfasada es prevenir de que en un futuro podrán
surgir incompatibilidades si seguimos usándolas ya que éste
es el paso a previo a la desaparición del API en concreto.

En la primera frase del comentario, que es la que la documentación
nos la muestra en la sección del resumen de nuestra clase, deberíamos
como mínimo poner desde que versión de nuestra API está
desautorizada y por quién se debería sustituir. A partir
de Java 1.2 podemos usar {@link} para referenciar por quién
debemos hacer la sustitución.

 

 @exception nombre-clase descripción (desde
la versión 1.0 del JDK/SDK)

Esta etiqueta actúa exactamente igual que  @throws.

 

 {@link nombre etiqueta} (desde la versión
1.2 del JDK/SDK)

Inserta un enlace autocontenido que apunta a nombre.
Esta etiqueta acepta exactamente la misma sintáxis que la etiqueta
@see, que se describe más abajo, pero genera un enlace
autocontenido en vez de colocar el enlace en la sección "See Also".
Dado que esta etiqueta usa los carácteres { } para separarla del
resto del texto in-line, si necesitas emplear el caracter "}" dentro de
la etiqueta debes usar la notación HTML &#125;

No existe ninguna limitación en cuanto al número de etiquetas
de este tipo permitidas. Puedes usarlas tanto en la parte de la descripción
como en cualquier porción de texto de cualquier otra etiqueta de
las que nos proporciona JavaDoc.

En el siguiente ejemplo, vemos como crear dentro de nuestra documentación
un enlace in-line al método getComponentAt(int, int).

@deprecated Desde JDK1.1 Usar el método {@link #getComponentAt(int,
int) getComponentAt}

A partir de esta descripción, la herramienta de generación
automática de código generará el siguiente código
HTML (supone que se está refiriendo a una clase del mismo paquete):

Usar el método <a href="Component.html#getComponentAt(int,
int)">getComponentAt</a>
, el cual aparecerá en la página
HTML como:

Usar el método getComponentAt

 

@param parámetro descripción (desde la
versión 1.0 del JDK/SDK)

Añade un parámetro y su descripción a la sección
"Parameters" de la documentación HTML que generará. Por tanto,
para cada método emplearemos tantas etiquetas de este estilo como
parámetros de entrada tenga dicho método.

 

@return descripción (desde la versión
1.0 del JDK/SDK)

Añade a la sección "Returns" de la documentación
HTML que va a generar la descripción del tipo que devuelve el método.
Veámos el siguiente ejemplo:

Si suponemos que tenemos el método public String concatena(String
s1, String s2, String s3)
deberíamos comentar nuestro código
fuente de la siguiente manera:

/*
* ....
* @param s1 Texto que ocupa la cabecera
* @param s2 Texto que ocupa el cuerpo de la string a crear
* @param s3 Texto que ocupa la parte final
* @return La cadena conformada de tipo String.
*/



@see referencia (desde la versión 1.0 del
JDK/SDK)

Añade un cabecero "See Also" con un enlace o texto que apunta
a una referencia. El comentario de la documentación puede contener
cualquier número de etiquetas de este tipo y todas, al generar la
documentación, se agruparán bajo el mismo cabecero. Esta
etiqueta se puede conformar de tres maneras diferentes, siendo la última
forma la más utilizada.

 



@see "string"



En este caso, no se genera ningún enlace. La string es un
libro o cualquier otra referencia a una información que no está
disponible via URL. JavaDoc distingue este caso buscando en el primer carácter
de la cadena las comillas dobles ("). Por ejemplo:


@see "The Java Programming Language"

que genera el siguiente texto HTML:



See Also:



"The Java Programming Language"





@see <a href="URL#value">label</a>



Añade un enlace definido por URL#value. Esta dirección puede
ser relativa o absoluta. JavaDoc distingue este caso buscando en el primer
carácter el símbolo "<". Por ejemplo:


@see <a href="spec.html#section">Java Spec</a>

que genera el siguiente enlace:



See Also:



Java Spec








@see  package.class#member texto



Añade un enlace, con el texto visible texto, que apunta en
la documentación al nombre especificado en el lenguaje Java al cual
hace referencia. Aquí por nombre se debe entender un paquete, una
clase, un método o un campo. El argumento texto es opcional,
si se omite, JavaDoc nos dará la información mínima,
ésto es, el nombre de, por ejemplo, la pareja paquete#método.
Usa este campo cuando quieras especificar algo más, cuando quieras
representarlo por un nombre más corto o simplemente si quieres que
aparezca con otro nombre. Veámos a continuación varios ejemplos
usando la etiqueta @see.




Nota: El comentario a la derecha muestra cómo aparecerá
la etiqueta en las especificaciones HTML si la referencia a la que apunta
estuviera en otro paquete distinto al que estamos comentando.
                                           See also: 
@see java.lang.String                   //  String                           
@see java.lang.String The String class  //  The String class                 
@see String                             //  String                           
@see String#equals(Object)              //  String.equals(Object)            
@see String#equals                      //  String.equals(java.lang.Object)   
@see java.lang.Object#wait(long)        //  java.lang.Object.wait(long)      
@see Character#MAX_RADIX                //  Character.MAX_RADIX              
@see <a href="spec.html">Java Spec</a>  //  Java Spec            
@see "The Java Programming Language"    //  "The Java Programming Language"        




@since texto (desde la versión 1.1 del JDK/SDK)

Indica con texto desde cuándo se creó este paquete, clase
o método. Normalmente se pone la versión de nuestra API en
que se incluyó, así en posteriores versiones sabremos a qué
revisión pertenece o en qué revisión se añadió.
Por ejemplo:

@since JDK1.1



@serial field-description (desde la versión
1.2 del JDK/SDK)

Su uso está destinado a señalar un campo serializable.
Por defecto, todos los campos (variables) son susceptibles de ser serializados
lo cual no quiere decir que nuestra aplicación lo tenga que hacer.
Por tanto, úsala sólo cuando tengas una variable serializable.
Aprovecho para decirte que no te asustes si tu clase tiene, digamos, 20
variables y al generar la documentación HTML te "cantan" 20 warnings.
Ésto ocurre porque JavaDoc esperaba que hubieras asignado una etiqueta
serial a cada una de tus variables ya que como dije antes, en principio
todas estas variables pueden ser serializables. En fin, la 2ª vez
que generes la documentación ya no te asustará ;-).

 

@serialField field-name field-typefield-description
(desde la versión 1.2 del JDK/SDK)

Documenta un componente ObjectStreamField de un  miembro
serialPersistentFields
de una clase Serializable.
Esta etiqueta se debería usar para
cada componente ObjectStreamField.

 

@serialData data-description (desde la versión
1.2 del JDK/SDK)

Se emplea para describir los datos escritos por el método writeObject
y todos los datos escritos por el método Externalizable.writeExternal.
Esta etiqueta puede ser usada en aquellas clases o métodos que intervengan
los métodos writeObject,
readObject,
writeExternal,
and
readExternal.

 

@throws nombre-clase descripcion
(desde la versión 1.2 del JDK/SDK)

Como ya se apuntó, esta etiqueta es la gemela de @exception.
En ambos casos, se añade una cabecera "Throws" a la documentación
generada con el nombre de la excepción que puede ser lanzada por
el método (nombre-clase) y una descripción de por
qué se lanza.

 

@version version (desde la versión 1.0 del JDK/SDK)

Añade un cabecero a la documentación generada con la versión
de esta clase. Por versión, normalmente nos referimos a la versión
del software que contiene esta clase o miembro.

 

 


Donde se emplean las etiquetas.


Una vez sabemos de las etiquetas que disponemos, pasamos a ver dónde
se pueden emplear. Un detalle importante a tener en cuenta es que SIEMPRE
que se quiera comentar algo, una clase, un método, una variable,
etc..., dicho comentario se debe poner inmediatamente antes del item a
comentar. En caso contrario la herramienta de generación automática
no lo reconocerá.

 


Comentario de la página "Overview".


Las etiquetas que se pueden emplear en esta sección son: @see,
{@link}, @since
. Observa que ésto no se corresponde con ninguna
parte de un código Java. La página "Overview", que reside
en un fichero fuente al que normalmente se le da el nombre de overview.html
es la que nos da una idea global de las clases y paquetes que conforman
nuestra API (ver especificaciones html de Sun).

 


Comentario de paquetes.


Este tipo de comentarios tampoco lo hacemos en nuestro código fuente
sino en una página html que reside en cada uno de los directorios
de nuestros paquetes y que siempre se le da el nombre de package.html.

Las etiquetas que podemos utilizar en este caso son: @see, {@link},
@since, @deprecated


 


Comentario de clases e interfaces.


Disponemos de las siguientes etiquetas: @see, {@link}, @since, @deprecated,
@author, @version.
Veámos un ejemplo del comentario de una
clase:
/**
* A class representing a window on the screen.
* For example:
* <pre>
*       Window win = new Window(parent);
*       win.show();
* </pre>
*
* @author  Sami Shaio
* @version %I%, %G%
* @see     java.awt.BaseWindow
* @see     java.awt.Button
*/
class Window extends BaseWindow {
...
}



Comentario de variables.


Las etiquetas que podemos utilizar en esta ocasión son: @see,
{@link}, @since, @deprecated, @serial, @serialField
. Un ejemplo:
/**
* The X-coordinate of the component.
*
* @see #getLocation()
*/
int x = 1263732;



Comentario de métodos y constructores.


En este caso disponemos de: @see, {@link}, @since, @deprecated, @param,
@return, @throws (@exception), @serialData
. Un ejemplo:
/**
* Returns the character at the specified index. An index
* ranges from <code>0</code> to <code>length() - 1</code>.
*
* @param     index  the index of the desired character.
* @return    the desired character.
* @exception StringIndexOutOfRangeException if the index is not in the range <code>0</code>
* to <code>length()-1</code>.
* @see       java.lang.Character#charValue()
*/
public char charAt(int index) {
   ...
}





Próximo capítulo.



En el siguiente capítulo analizaremos las múltiples opciones
o argumentos que la herramienta JavaDoc nos proporciona para generar la
documentación HTML de nuestras API's.
















Leo Suarez es un Ingeniero Superior de Telecomunicaciones por la
Universidad de Las Palmas de Gran Canaria con todas sus letras, que no
son pocas, y trabaja como tal en Santa Cruz de Tenerife.
Cuando no
está saltando de isla en isla o escribiendo para javaHispano aprovecha
para disfrutar con la novia y los amigos del estupendo clima de las islas afortunadas.

Para cualquier duda o tirón de orejas, e-mail a:
leo_ARROBA_javahispano.com




jueves
oct112001

Compaq tambrión con Java

Compaq ha anunciado que todos sus nuevos PDAs incorporarýn una JVM para poder disfrutar de las posibilidades que otorga Java a los dispositivos móviles.


La JVM sera la de la plataforma Jeode de
Insignia, un lider en lo referente a Java en dispositivos móviles, por lo que la calidad esta asegurada.


Curiosamente, los PocketPC de Compaq usan el SO de Microsoft.