jueves, 29 de septiembre de 2011

Autogeneración de código

Equipo
import java.util.*;


/**
 * Class Equipo
 */
public class Equipo {

  //
  // Fields
  //

  private int cantidad;
  private int color;
  private String nombre;
  private boolean activo;
  
  //
  // Constructors
  //
  public Equipo () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of cantidad
   * @param newVar the new value of cantidad
   */
  private void setCantidad ( int newVar ) {
    cantidad = newVar;
  }

  /**
   * Get the value of cantidad
   * @return the value of cantidad
   */
  private int getCantidad ( ) {
    return cantidad;
  }

  /**
   * Set the value of color
   * @param newVar the new value of color
   */
  private void setColor ( int newVar ) {
    color = newVar;
  }

  /**
   * Get the value of color
   * @return the value of color
   */
  private int getColor ( ) {
    return color;
  }

  /**
   * Set the value of nombre
   * @param newVar the new value of nombre
   */
  private void setNombre ( String newVar ) {
    nombre = newVar;
  }

  /**
   * Get the value of nombre
   * @return the value of nombre
   */
  private String getNombre ( ) {
    return nombre;
  }

  /**
   * Set the value of activo
   * @param newVar the new value of activo
   */
  private void setActivo ( boolean newVar ) {
    activo = newVar;
  }

  /**
   * Get the value of activo
   * @return the value of activo
   */
  private boolean getActivo ( ) {
    return activo;
  }

  //
  // Other methods
  //

  /**
   */
  public void generar(  )
  {
  }


}

Tablero
import java.util.*;


/**
 * Class Tablero
 */
abstract public class Tablero {

  //
  // Fields
  //

  private int tamaño;
  private int color;
  
  //
  // Constructors
  //
  public Tablero () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of tamaño
   * @param newVar the new value of tamaño
   */
  private void setTamaño ( int newVar ) {
    tamaño = newVar;
  }

  /**
   * Get the value of tamaño
   * @return the value of tamaño
   */
  private int getTamaño ( ) {
    return tamaño;
  }

  /**
   * Set the value of color
   * @param newVar the new value of color
   */
  private void setColor ( int newVar ) {
    color = newVar;
  }

  /**
   * Get the value of color
   * @return the value of color
   */
  private int getColor ( ) {
    return color;
  }

  //
  // Other methods
  //

  /**
   */
  public void iniciar(  )
  {
  }


  /**
   */
  public void empatar(  )
  {
  }


  /**
   */
  public void salir(  )
  {
  }


}


Pieza
import java.util.*;


/**
 * Class Pieza
 */
public class Pieza {

  //
  // Fields
  //

  protected boolean activa;
  protected int posicion;
  
  //
  // Constructors
  //
  public Pieza () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of activa
   * @param newVar the new value of activa
   */
  protected void setActiva ( boolean newVar ) {
    activa = newVar;
  }

  /**
   * Get the value of activa
   * @return the value of activa
   */
  protected boolean getActiva ( ) {
    return activa;
  }

  /**
   * Set the value of posicion
   * @param newVar the new value of posicion
   */
  protected void setPosicion ( int newVar ) {
    posicion = newVar;
  }

  /**
   * Get the value of posicion
   * @return the value of posicion
   */
  protected int getPosicion ( ) {
    return posicion;
  }

  //
  // Other methods
  //

  /**
   */
  public void mover(  )
  {
  }


  /**
   */
  protected void capturar(  )
  {
  }


}


Reina
/**
 * Class Reina
 */
public class Reina extends Pieza{

  //
  // Fields
  //

  
  //
  // Constructors
  //
  public Reina () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  /**
   */
  public void mover(  )
  {
  }


}

Comparando mi código con el código autogenerado, se puede apreciar que es practicamente igual, en lo único que varía es que el código autogenerado utiliza métodos set y get.

Documentación

Clase Damas
/** 
* @author Julio Garcia
* @version 1.0
*/
import java.util.Scanner;

/** Clase principal */
public class Damas{

public static void main(String args []){
    Scanner lectura = new Scanner (System.in);
    System.out.print("Nombre del jugador: ");
    String nombre  = lectura.nextLine();  
    Tablero a1 = new Tablero ("negro");
    Equipo e1 = new Equipo ("roja",nombre,true);
    Equipo e2 = new Equipo ("blanca","Computadora",false);
    System.out.println();
    System.out.println("Jugador: "+e1.getnombre());   
    System.out.println();
    e1.generar();
    System.out.println();
    System.out.println("Jugador 2: "+e2.getnombre());
    System.out.println();
    e2.generar();
    System.out.println();
    System.out.println("Tablero\n");
    a1.iniciar();
}
}

Clase Equipo
/** Clase para generar el equipo */
public class Equipo {
    private int cantidad = 12;
    private String color;
    private String nombre;
    private boolean activo;

/**Constructor
 @param color indica el color de las piezas
 @param nombre indica el nombre del jugador
 @param activo indica si es el turno del jugador*/
public Equipo(String color, String nombre, boolean activo){
    this.color = color;
    this.nombre = nombre;
    this.activo = activo;
}

/** Genera las piezas del equipo */
public void generar(){
    int i;
    Pieza [] ficha;
    ficha = new Pieza [cantidad];
    for(i = 0; i < cantidad; i++){
 ficha [i] = new Pieza (true,color); 
 System.out.println("Ficha: "+(i+1)+" Color: "+color);
}

}


/**  Método para imprimir el nombre del jugador 
* @return nombre */
public String getnombre(){
return nombre;
}

}
Clase Pieza
/** Características de la Pieza */
public class Pieza{
    protected boolean activa;
    protected String color;

/** Constructor
    @param activa inidica si la pieza esta disponible
    @param color indica el color de la pieza*/
    public Pieza(boolean activa, String color){
 this.activa = activa;
        this.color = color; 
    }
/**  Método para el movimiento de la pieza hacia adelante*/
    public void mover(){
    }
/**  Método para eliminar una pieza */
    public void capturar(){
    }

} 

Clase Reina
/** Clase hija que hereda de la clase Pieza */
public class Reina extends Pieza{
/** Constructor 
*hereda los atributos de pieza
*/
    public Reina(boolean activa, String color){
    super (activa, color);
}

/**   Método que permite mover la pieza, ya sea avanzar o retroceder */
    public void mover(){

}
}
Clase Tablero
/** En está clase interactúan las demás clases*/
public class Tablero{
    private String color = "Rojo";

/**Constructor
  @param color indica el color del tablero
*/
public Tablero (String color){
    this.color = color;
  
}

/**  Método que se encarga de inicializar el juego*/
public void iniciar(){
   int [][] a = new int[8][8];
    int i, j;   
    for(i = 0; i < 3; i++){
 for(j = 0; j < 8; j++){
     if(i%2 == 0){
  if(j%2 != 0){
      a[i][j] = 1;
      System.out.print("*");
  }
  else {
      System.out.print(0);
  }
     }
      else { 
    if(j%2 == 0){
        a[i][j]= 1;
        System.out.print("*");
    }
    else {
        System.out.print(0);
    }
      }
 }
 System.out.println();
    }

    for (i = 3; i < 5; i++){
 for(j = 0; j < 8; j++){
 a[i][j]= 0;
 System.out.print(0);
 }
 System.out.println();
    }

   for(i = 5; i < 8; i++){
 for(j = 0; j < 8; j++){
     if(i%2 == 0){
  if(j%2 != 0){
      a[i][j] = 1;
      System.out.print("*");
  }
  else {
      System.out.print(0);
  }
     }
      else { 
    if(j%2 == 0){
        a[i][j]= 1;
        System.out.print("*");
    }
    else {
        System.out.print(0);
    }
      }
 }
 System.out.println();
    }


}

/**  Método para terminar el juego en empate*/
public void empatar(){

}

/**  Método para abandonar el juego*/
public void salir(){

}

}

Para generar la documentación nos ubicamos en la carpeta, ponemos lo siguiente



Nos generará la documentación en html



Para descargar la documentación

Herencia y Polimorfismo

Pieza
public class Pieza{
    protected boolean activa;
    protected String color;

/*Constructor*/
    public Pieza(boolean activa, String color){
        this.activa = activa;
        this.color = color;
    }

    public void mover(){
    }

    public void capturar(){
    }

}




Reina
public class Reina extends Pieza{

    public Reina(boolean activa, String color){
    super (activa, color);
}

    public void mover();
}

Diagrama de Clases


Tarjetas CRC


Clase: Tablero
ID: 01
Tipo: Clase normal
Descripción: Escenario donde se desplazan los dos equipos
Casos de uso:
Responsabilidad: Sirve para diseñar donde los demás objetos interactúan al momento de jugar.
Colaboradores: Equipo, Pieza, Reina

Atributos: color, tamaño
Relación: asociación

Clase: Equipo
ID: 02
Tipo: Clase normal
Descripción: Sirve para generar las 12 piezas de cada jugador
Casos de uso: Configurar
Responsabilidad: Sirve para diseñar las pieza de cada equipo.
Colaboradores:  Pieza, Reina

Atributos: cantidad, color, nombre, activo
Relación: asociación
Clase: Pieza
ID: 03
Tipo: Clase padre
Descripción: Se encarga de modelar las características de las piezas
Casos de uso: Mover, Capturar, Coronar
Responsabilidad: Sirve para diseñar como mover la pieza de manera inclinida y además poder capturar a las piezas contrarias
Colaboradores:
Atributos: activa
Relación: asociación

Clase: Reina
ID: 04
Tipo: Clase hija
Descripción: Subclase que hereda de la clase pieza
Casos de uso: Mover, Capturar
Responsabilidad: Sirve para poder diseñar como mover la pieza de manera inclinada, además de poder moverse hacia adelante o hacia atrás y capturar a las otras piezas contrarias.  
Colaboradores:  Pieza

Atributos: activa
Relación: generalización

martes, 27 de septiembre de 2011

Retroalimentación en Pares

La retroalimentación sobre nuestros proyectos la hice con mi compañero Sergio, ambos estamos realizando un juego en java.

Su juego es el space invaders mientras que el mío es el de damas. Intercambiamos varias ideas y me recomendó buscar un buen algoritmo de movimiento definido. Además me aconsejo utilizar return para poder llamar datos de otra clase.

Considero que al estar haciendo el juego en el mismo lenguaje nos ayudará, así conforme vayamos avanzando en el proyecto podemos seguir intercambiando ideas.

Ejercicio Diagrama de clases



Elaborado con mi compañero Sergio Rdz

lunes, 26 de septiembre de 2011

Documentación

La documentación consiste en escribir comentarios para explicar el código de manera clara, con el fin de que se entienda lo que hace, ya que con el puro código no es suficiente.

Sin la documentación, nos puede suceder que al momento de retomar el proyecto después de un tiempo, ni nosotros mismos le entendamos. La documentación es importante para que no solo nosotros entendamos, si no que cuando otro programador retome el proyecto logre entenderlo fácilmente.

Una herramienta que podemos utilizar para documentar en Java es Javadoc. Una ventaja es que al momento en que instalamos el JDK, Javadoc se instala. Javadoc nos genera la documentación en un archivo html.

Para poder documentar se utiliza lo siguiente:
/**  Etiqueta  */
Para formar la etiqueta primero se coloca @ y después la palabra reservada.

Las etiquetas más comunes son las siguientes:


Etiqueta
Descripción
@autor
Nombre del autor
@deprecated
Indica que la clase o método son antiguos
@param
Indica parámetro que recibe un método
@return
Indica lo que devuelve el método
@see
Asocia un método o una clase con otro
@throws
Excepción lanzada por método
@version
Versión de la clase o método


Ejemplo

/** 
        * @author José A. Mañas - fprg5000
        * @version 23.9.2005
        */
       public class Circulo {
           private double centroX;
           private double centroY;
          private double radio;
          /**
           * Constructor.
           * @param cx centro: coordenada X.
           * @param cy centro: coordenada Y.
           * @param r radio.
           */
          public Circulo(double cx, double cy, double r) {
              centroX = cx;
              centroY = cy;
              radio = r;
          }
          /**
           * Getter.
           * @return centro: coordenada X.
           */
          public double getCentroX() {
              return centroX;
          }
          /**
           * Calcula la longitud de la circunferencia (perimetro del circulo).
           * @return circunferencia.
           */
          public double getCircunferencia() {
              return 2 * Math.PI * radio;
          }
          /**
           * Desplaza el circulo a otro lugar.
           * @param deltaX movimiento en el eje X.
           * @param deltaY movimiento en el eje Y.
           */
          public void mueve(double deltaX, double deltaY) {
              centroX = centroX + deltaX;
              centroY = centroY + deltaY;
         }
          /**
           * Escala el circulo (cambia su radio).
           * @param s factor de escala.
           */
          public void escala(double s) {
              radio = radio * s;
          }
      }
Para generar la documentación ponemos lo siguiente en la terminal
javadoc Circulo.java


Javadoc nos genera la documentación en html, buscamos el archivo index y al abrirlo nos aparecerá lo siguiente






Referencias

Herencia y Polimorfismo

La programación orientada a objetos (POO) tiene varias características importantes, entre ellas están la herencia y el polimorfismo.

La herencia es una característica que nos permite poder reutilizar código, es decir ahorramos código. Aquí manejamos una clase que contiene atributos y métodos de otra clase. A esta clase se le conoce como clase padre y las clases que heredan clases hijas.

El polimorfismo es una palabra que quiere decir muchas formas. Esta característica nos permite utilizar métodos con el mismo nombre, pero que tienen una función totalmente diferente.

Herencia aplicada al proyecto

En mi proyecto la clase padre es Pieza y la clase hija es Reina.

La clase Reina hereda lo siguiente:
  • Atributos: activa, color
  •  Métodos: capturar

“Reina es un tipo de Pieza”

Es importante analizar, ya que al utilizar herencia podemos caer en el error de querer utilizarla para todo y no siempre estamos ahorrando código.

Polimorfismo aplicado al proyecto

En la clase Pieza tengo el método mover y en la clase Reina también, sin embargo tienen funciones diferentes.

  • Clase Pieza mover (): Sirve para ir hacia adelante.
  •  Clase Reina mover (): Sirve para avanzar o retroceder.

Referencias: