Ingeniería de Software

Practica 1: Repaso Orientación Objetos y Java

El objetivo de esta práctica es retomar el ejemplo visto en curso para repasar los principios de:

  • Herencia
  • Asociación
  • Polimorfismo

En esta práctica vamos a programar con Java desde la consola. Más adelante utilizaremos un entorno de desarrollo integrado.

Creación de un proyecto Java

En general, se recomienda estructurar un proyecto Java dentro de un directorio raiz que contiene a su vez un conjunto de sub-directorios:
  • Vehiculos
    • src - archivos fuente
    • build - directorio en donde se ponen los archivos compilados
    • dist - distribución del proyecto
    • doc - documentación
    • lib - librerias
Paso 1.- Crea dentro de tu cuenta una estructura de directorios cómo la antes descrita

Creación de un espacio de nombres (package)

En clase vimos el concepto de espacio de nombres (que en Java se define usando la palabra reservada package).

Sun define un conjunto de convenciones para nombrar los diferentes elementos en Java (packages, clases, etc...). Estas convenciones se encuentran en la liga siguiente:

Paso 2.- Ver la convencion para el package y escoger un nombre de package. Una vez que hayas escogido tu nombre de package, crea dentro del directorio src los diferentes sub-directorios que corresponden al nombre de tu package.

Creación de las diferentes clases y comentarios de código

La figura siguente muestra el diagrama de clases del ejemplo visto en clase:



Una vez que hayas creado tus directorios correspondientes al package, puedes comenzar a escribir las distintas clases presentadas en el diagrama presentado arriba. En particular tienes que escribir las clases siguientes:

  • clase Abstracta Vehiculo
    • sub-clase Coche
    • sub-clase Camion
  • interfase Motor
    • implementación MotorTurbo
    • implementación MotorAltoRendimiento

Un ejemplo de clase Java es el siguiente:

package mi.espacio.nombres;

/**
 * Clase Ejemplo.
 *
*/
class Ejemplo

{
    private String miNombre;

    /**
     * Este es el constructor de la clase Ejemplo
     *
    */

    public Ejemplo(String cadena)
    {
        System.out.println("Ejemplo.Ejemplo()");
        miNombre = cadena;
    }

    /**
     * Este es el constructor de la clase Ejemplo
     *
    */

    public String leeMiNombre()
    {
        System.out.println("Ejemplo.leeMiNombre()");
        return miNombre;
    }

}

Para hacer la herencia se utiliza la palabra reservada extends.
Por ejemplo:

class OtroEjemplo extends Ejemplo
{

}

Para hacer una inferfase se utiliza la palabra reservada interface y todos los metodos declarados tienen que ser públicos.
Por ejemplo:

interface UnaInterface
{
    public void unMetodo();

}

Una implementación de esta interfase se realiza utilizando la palabra reservada implements.
Por ejemplo:

<>class UnaImplementacion implements UnaInterface
{
    public void unMetodo()
    {
        // Cuerpo del metodo
    }

}

Paso 3.- Escribe las clases tomando en cuenta las siguientes consideraciones:

  • Dentro de los metodos de las distintas clases vamos a realizar una traza utilizando el metodo System.out.println(""). Las trazas deberán indicar el nombre de la clase y el metodo en donde se encuentran.
  • Las sub-clases de Vehiculo deben recibir dentro de sus constructores una referencia hacia un motor.

Paso 4.- Creación de una clase principal

En un espacio de nombres distinto al que hiciste tus clases, crea una clase llamada Principal que va a contener un metodo main() que va a permitir lanzar el programa. Esta clase va a ser encargada de instanciar dos motores y dos vehiculos y de asociarlos (pasando el motor al constructor del vehiculos). Una vez que los vehiculos hayan sido instanciados, llamar al metodo enciende y apaga de cada uno de ellos.


La clase principal debe importar las clases correspondientes al los vehiculos y motores, ya que se encuentran en un espacio de nombres distinto (ver figura). Para ello se utiliza la palabra reservada imports.

import mi.espacio.nombres.MotorAltoRendimiento;
import mi.espacio.nombres.MotorTurbo;
import mi.espacio.nombres.Coche;
import mi.espacio.nombres.Camion

class Principal
{
    public static void main(String []args)
    {
        ...

    }
}

Compilación

Para realizar la compilación del código, se utiliza el comando javac (Java Compiler). La línea siguiente, ejecutada desde la raiz del proyecto, compila las distintas clases y las pone en el directorio build:
  • javac -d build/ src/mi/espacio/nombres/*.java src/mi/espacio/nombres/principal/*.java
Si quieres conocer las diferentes opciones de javac teclea el comando sin ningun parámetro.

Paso 5.- Realizar la compilación y verificar que se generan diferentes archivos .class bajo el directorio build. Corregir los errores

Ejecución

Para ejecutar nuestro código, utilizamos el comando java y hacemos referencia a la clase principal.
  • java -classpath build/ mi.espacio.nombres.principal.Principal
El classpath le indica al entorno de ejecución en que directorio va a encontrar las clases.

A la salida, debemos obtener una traza similar a esta:

Coche creado!
Camion creado!
Encendiendo:coche
Motor Turbo activado!
Apagando:coche
Motor Turbo desactivado!
Checando llenado...
Encendiendo:camion
Motor Alto Rendimiento activado!
Apagando:camion
Motor Alto Rendimiento desactivado!

Documentación

Java provee un mecanismo que permite, a partir del código fuente, generar la documentación de un proyecto en formato HTML. Para ello es necesario comentar el código siguiendo unas convenciones particulares descritas aquí.

El código del API de Java está comentado utilizando Javadoc. La documentación de este código está aqui.

El ejemplo de código anterior con su documentación Javadoc queda cómo sigue:

package mi.espacio.nombres;

/**
 * Clase Ejemplo.
 *
 * @author Humberto Cervantes
 * @version 1.0
 */
class Ejemplo

{
    private String miNombre;

    /**
     * Este es el constructor de la clase Ejemplo
     *
     * @param cadena cadena que inicializa el nombre
    */

    public Ejemplo(String cadena)
    {
        System.out.println("Ejemplo.Ejemplo()");
        miNombre = cadena;
    }

    /**
     * Este es el constructor de la clase Ejemplo
     *
     * @return regresa una cadena que contiene el nombre
    */

    public String leeMiNombre()
    {
        System.out.println("Ejemplo.leeMiNombre()");
        return miNombre;
    }

}

Paso 6.- Generación de Javadoc.

En una primera etapa, comenta el código que escribiste utilizando convenciones Javadoc. Una vez que esto esté hecho, genera la documentación utilizando el comando javadoc:

  • javadoc -d docs/javadoc/ -sourcepath src/ mi.espacio.nombres mi.espacio.nombres.principal
Si quieres conocer las diferentes opciones de javadoc teclea el comando sin ningún parámetro.

Comprueba que se generó la documentación dirigiendo tu navegador al directorio (docs/javadoc) donde se generó la documentación:



Empaquetamiento

El empaquetamiento va a permitir poner juntos los diferentes archivos de nuestro proyecto dentro de un sólo archivo con extensión JAR (Java Archive).

Paso 7.- Para realizar el empaquetamiento de los archivos compilados, se utiliza el comando jar. La sintáxis es la siguiente:
  • jar cvf dist/vehiculos.jar -C build/ mi/espacio/nombres/
Esto genera una salida similar a la siguiente:
added manifest
adding: mx/uam/vehiculos/(in = 0) (out= 0)(stored 0%)
adding: mx/uam/vehiculos/principal/(in = 0) (out= 0)(stored 0%)
adding: mx/uam/vehiculos/principal/Principal.class(in = 612) (out= 393)(deflated 35%)
adding: mx/uam/vehiculos/Camion.class(in = 648) (out= 419)(deflated 35%)
adding: mx/uam/vehiculos/Motor.class(in = 151) (out= 128)(deflated 15%)
adding: mx/uam/vehiculos/Vehiculo.class(in = 914) (out= 506)(deflated 44%)
adding: mx/uam/vehiculos/Coche.class(in = 460) (out= 313)(deflated 31%)
adding: mx/uam/vehiculos/MotorAltoRendimiento.class(in = 594) (out= 345)(deflated 41%)
adding: mx/uam/vehiculos/MotorTurbo.class(in = 552) (out= 332)(deflated 39%)

Una vez que se ha empaquetado verificar que bajo el directorio dist se encuentra el archivo vehiculos.jar.

Ejecución desde JAR

Paso 8. Se puede ejecutrar el programa desde un archivo jar que contenga código binario. Basta poner el archivo jar dentro del classpath:
  • java -classpath dist/vehiculos.jar mi.espacio.nombres.principal.Principal
Verificar que se obtiene la salida correcta.

A Entregar

Hacer un archivo Jar que contenga todos los directorios y enviarlo por correo.

Síntesis

Esta practica permitió repasar los conceptos orientados a objetos estudiados en clase y probar las herramientas que provee el SDK de Java para:
  • Compilar (javac)
  • Documentar (javadoc)
  • Empaquetar (jar)
  • Ejecutar (java)
Sin embargo, la ejecución desde la línea de comando de estos comandos tiene sus inconvenientes:
  • Complicado
  • Dificil de repetir
  • No portable


Ultima actualización: 18 Enero 2005
contacto: hcm@xanum.uam.mx
Homepage