jueves, 15 de mayo de 2008

Primer proyecto (completo)

Vamos a crear un proyecto desde cero

Lo voy a llamar 'prouno'. En la ventana 'package' menú contextual/new java project/next/finish.

El proyecto tiene que tener tres carpetas tipo Source Folder, una llamada src, otra llamada test y una tercera llamada Lib, ésta de tipo Folder, donde vamos a incluir las librerias, en este caso metemos la libreria testng: la copiamos de otro proyecto y después, menú contextual en la librería/build path/add to build path. Va a parecer que no está en la carpeta lib, pero si lo miramos desde la ventana Navigator veremos que sí.

Ahora vamos a relacionar el proyecto con nuestro repositorio: menú contextual en nuestro proyecto/Team/share project/SVN/next/seleccionamos nuestro repositorio/next/next/finish. Esperamos un rato a que importe los datos. Se abre una ventana que nos pide que seleccionemos lo que queremos importar. Seleccionamos todo menos los .classpath y los .project, y damos a OK... y esperamos un poco. Ya tenemos nuestro proyecto en nuestro repositorio.

Tener en cuenta que las carpetas src y test deben tener una estructura de directorios idéntica a medida que trabajemos con ellas.

En la carpeta src vamos a crear un nuevo package: menú contextual/new/package. Lo llamo eticom. Finish.
Aquí creo una serie de cosas:
  • una clase cualquiera: menú contextual sobre src/eticom, new/class. La voy a llamar 'Coche'. y como atributos: color, marca, puertas.
public class Coche {

//Atributos:
String color;
String marca;
String puertas;

}

  • una clase de tipo enum: creo antes, en src el 'package' eticom.enums. Aquí creo la clase: menú contextual sobre este paquete/new/enum. La llamo 'Nombres', que van a ser los nombres de los posibles nombres de los programadores.
package eticom.enums;

public enum Nombres {
Alberto, Rafa, Antonio
}

  • una anotacion cualquiera con al menos un atributo de tipo primitivo y otro del tipo enum anteriormente creado: al igual que con el paquete enums, creamos un nuevo paquete en src, que la vamos a llamar eticom.anotaciones, y ahí creamos la anotación: menú contextual/new/annotation. La voy a llamar 'Programador', en la que como atributo voy a tener la variable 'nombreProgramador()'. Hay que tener muy en cuenta las importaciones de paquetes.
package eticom.anotaciones;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import eticom.enums.Nombres;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})

public @interface Programador {

//Atributo primitivo:
String cargo();

//Atributo de tipo enum:
Nombres nombreProgramador();

}

  • aplicamos la anotación a la clase que hemos creado, eligiendo los valores correspondientes; la clase quedaría de tal forma:
package eticom;

import eticom.anotaciones.Programador;
import eticom.enums.*;

@Programador(cargo = "jefe de proyecto", nombreProgramador = Nombres.Rafa)

public class Coche {

/*
* Estos son los atributos de la clase
*/

String color;
String marca;
int puertas;

/*
* Método constructor por defecto
*/
public Coche(){
}

/*
* Método constructor
*/
public Coche(String col){
this.color=col;
}

/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/

public boolean equals(Object o){

boolean bol = false;
Coche car = (Coche)o;
if(car.color.equals(this.color)){
bol = true;
}

return bol;
}

}

En la carperta test hay que crear lo siguiente:
Una clase de prueba llamada igual que la clase pero con el sufijo Test en la que creamos:
  • un método de prueba utilizando el framework de pruebas TestNG. En dicho método comprobaremos que los valores de la anotación coinciden con los que esperamos
  • otro método de prueba que compruebe que el método equals de mi clase "Mesa" funciona correctamente. Para ello, en dicho método necesitaremos al menos 3 instancias/objetos de dicha clase para la demostración
package eticom;

import org.testng.annotations.Test;
import eticom.anotaciones.Programador;
import eticom.enums.Nombres;

public class CocheTest {

@Test
public void pruebaProgramador() {

assert(Coche.class.isAnnotationPresent(Programador.class)) : " la anotacion Programador aparece en la clase Coche";
Programador miAnotacion = Coche.class.getAnnotation(Programador.class);
assert(miAnotacion.nombreProgramador().equals(Nombres.Rafa)) : " El valor del nombre no es Alberto ni Antonio";
assert(!miAnotacion.cargo().equals("programador")) : " el cargo es de jefe de proyecto";

}

public void pruebaCoche(){

Coche coche1 = new Coche();
coche1.color = "rojo";
Coche coche2 = new Coche();
coche2.color = "rojo";
Coche coche3 = new Coche();
coche3.color = "negro";

assert(coche1.equals(coche2)): " el " + coche1 + " y el " + coche2 + " deben ser iguales";
assert(!coche2.equals(coche3)): " el " + coche2 + " y el " + coche3 + " deben ser distintos";
}

}

Ahora, al lanzar la clase CocheTest (menú contextual sobre esta clase/Run as/TestNG Test), la prueba tiene que salir en verde, lo que significa que está bien hecho.

NOTA IMPORTANTE: Para estar seguros que está bien, primero hacemos la prueba de CocheTest pero anulando el método public boolean equals(Object o){ } de la clase Coche, para así estar seguros de que hemos hecho bien el casting al objeto y pasado a Coche.

Ahora genero el javadoc (nos genera toda la documentación de nuestro programa), para lo cual seleccionamos, desde la barra menú, proyecto/Generate Javadoc, y en 'Javadoc command' -> C:\Archivos de programa\Java\jdk 1.6.0_06\bin y finish. Y me debería aparecer una nueva carpeta con la documentación, al estilo de las APIs de JAVA.

Ahora actualizo el código de mi proyecto en eclipse al repositorio -> menú contextual sobre mi proyecto/team/commit, selecciono todas las casillas excepto los .classpath y los .project, y pincho en OK.

Y ya hemos completado nuestro primer proyecto empleando una clase, una clase enum, una clase annotation y una clase de prueba.

¿Más claro?

No hay comentarios: