Pages

Autogeneracion de codigo

Usando umbrello autogenere codigo apartir de mi diagrama uml.

Debo aceptar que no me parecia pertinente, pero al ver los resultados y considerando el tamaño de mi diagrama me di cuenta que es muy recomendable utilizar las herramientas CASE.

independientemente de que el codigo generado sea lo suficientemente util, en mi caso representa una gran ayuda al momento de codificar, ya que algunas clases era un poco extensas con muchos metodos get y set, umbrello autogenero todos estos metodos.

Todo el codigo generado por umbrello esta en este rar

Digrama de Clases

Bueno usando umbrello genere el diagrama de clases.

Actualmente es un poco confuso porque no domino el uso de umbrello, asi que dejare el .xmi por si no es muy claro.

La imagen es esta:

Documentacion Tecnica

La forma en la que mantendre un control de la documentacion tecnica es con Javadoc.
Cada uno de mis clases contendra comentarios especiales requeridos por el javadoc para la generacion de la documentacion, la cual se creara en formato de paginas html para su mejor visualizacion.


Aqui esta la documentacion creada. Descarga

Herencia y Poliformismo

He aqui la herencia de mi proyecto.

No incluyo la relacion de herencia de los Servlets, porque aclaro que ya esta definida la Clase HttpServlet y no es codificacion propia.


La clase Articulo la deje con propiedades para poder heredarla y obtener una clase derivada mas reducida y que sea de contenido parecido, como el autor no lo requiero en mis clases hijas lo deje private.

public class Articulo {

 protected String nombre;
 private String autor;
 protected float  precio;
 protected String estado;
 
 public String getNombre() {
  if(nombre == null){
   nombre = "Sin nombre especificado";
   return nombre; 
  }else{
   return nombre;
  }
 }
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 public String getAutor() {
  if(autor == null){
   autor = "Sin autor especificado";
   return autor; 
  }else{
   return autor;
  }
 }
 public void setAutor(String autor) {
  this.autor = autor;
 }
 public String getEstado() {
  if(estado == null ){
   estado = "regular";
   return estado; 
  }else{
   return estado;
  }
 }
 public void setEstado(String estado) {
  if(estado == "bueno"){
   this.estado = estado;
  }else if(estado == "malo"){
   this.estado = estado;
  }else if(estado == "regular"){
   this.estado = estado;
  }
 }
 
 public float getPrecio() {
  return precio;
 }
 public void setPrecio(float precio) {
  this.precio = precio;
 }
 
 public Articulo llenaDatos(Object obj)  {

  if(obj instanceof Articulo){
   Articulo UserObject = (Articulo)obj;
    
    setNombre(UserObject.getNombre());
    setAutor(UserObject.getAutor());
    setPrecio(UserObject.getPrecio());
    setEstado(UserObject.getEstado());

   
    return UserObject;
  
  }else{

   return this;
  }
 }
}


Clase que hereda de Articulo
public class ArticuloGadget extends Articulo {

 private String comentario;
 
 public String getComentario() {
  if(comentario == null){
   this.comentario = "sin comentarios";
   return this.comentario;
  }else {
   return comentario;
  }
 }
 
 public void setComentario(String comentario) {
  this.comentario = comentario;
 }
 
 
}

El polimorfismo aplica en mi clase CarroWeb.
ya que puede aplicar que remueva o agrege determinado tipo de Articulo.
Este es la parte de la clase que lo implementa.
public class CarroWeb {

        private List listadoLibros;
 private List listadoGadgets;
 private Float total, nuevaCantidad;
 private String respuesta;
 private RemovedorDatos rm;
 private String usuario;

public void Agrega(Articulo libro){
   listadoLibros.add(libro); 
 }
 
 public void Agrega(ArticuloGadget gadget){
  listadoGadgets.add(gadget);
 }

 
 
 public void Remueve(Articulo libro){
  if(listadoLibros.contains(libro)){
   for(Articulo item : listadoLibros){
    if(item.getNombre() == libro.getNombre()){
     listadoLibros.remove(item);
    }
   }
  }
 }

 public void Remueve(ArticuloGadget gadget){
  if(listadoGadgets.contains(gadget)){  
   for(ArticuloGadget item : listadoGadgets){
    if(item.getNombre() == gadget.getNombre()){
     listadoGadgets.remove(item);
    }
   }
  }
 }
}

Esqueleto de las clases

Servlets
Verificador

public class Verificador extends HttpServlet 
        private Connection conn;
 private ResultSet rs;
 private String usuario;
 private String password;
  private Boolean valida;
  private Manejador bd;
  private PreparedStatement pst;
  private HttpSession session;
  private Datos datos;
  private Usuario dummy;
  private CarroWeb carro;

*public void init(ServletConfig config){}
public Boolean validaDatos(HttpServletResponse resp){}
public HttpSession creaNuevaSesion(HttpServletRequest req){}
*public void doGet(HttpServletRequest request, HttpServletResponse response){}
*public void doPost(HttpServletRequest request, HttpServletResponse response){}
* Son metodos predefinidos de los servlets e init hace la funcion del constructor.


Registro
public class Registro extends HttpServlet 
       
 private Usuario dummy;
  private Connection conn;
  private PreparedStatement pst,pst2;
  private Manejador bd;
  private HttpSession session;

*public void init(ServletConfig config){}
public void agregarUsuario(HttpServletResponse resp){}
*public void doGet(HttpServletRequest request, HttpServletResponse response){}
*public void doPost(HttpServletRequest request, HttpServletResponse response){}
* Son metodos predefinidos de los servlets e init hace la funcion del constructor.


CarroWebServlet
public class CarroWebServlet extends HttpServlet 
 
 private CarroWeb carroActual;
 private HttpSession session;
 private Articulo libro;
 private ArticuloGadget gadget;
 private String tipoGadget,tipoLibro,remover;

*public void init(ServletConfig config){}
public void removerItem(HttpServletRequest request,HttpServletResponse response){}
public void agregarItem(HttpServletRequest request,HttpServletResponse response){}
public ArticuloGadget Gadget(HttpServletRequest request){}
public Articulo Libro(HttpServletRequest request){}
*public void doGet(HttpServletRequest request, HttpServletResponse response){}
*public void doPost(HttpServletRequest request, HttpServletResponse response){}
* Son metodos predefinidos de los servlets e init hace la funcion del constructor.


Error
public class Error 
        public static StringBuffer buffer;
 public static PrintWriter salida;
public static HttpServletResponse despliegaError(HttpServletResponse resp,String ex){}


Clases
Usuario
public class Usuario 

 private String user;
  private String password;
 private String nombre;
  private String apellidoMaterno;
  private String apellidoPaterno;
  private int edad;
  private String correo;
  private String telefono;
  private String calle;
  private String colonia;
  private String cp;
  private String numero;
  private float credito;
  private Boolean admin;
public Usuario(Object obj){} // Construye a partir de un objeto dado.
public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo
public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo.


Articulo
public class Articulo 

        protected String nombre;
 private String autor;
 protected float  precio;
 protected String estado;

public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo
public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo.
public Articulo(Object obj){} // Construye a partir de un objeto dado.


ArticuloGadget
public class ArticuloGadget extends Articulo
     private String comentario;

public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo
public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo.
public ArticuloGadget(){} // constructor que solo usa super();


CarroWeb
public class CarroWeb 

 private List listadoLibros;
 private List listadoGadgets;
 private Float total, nuevaCantidad;
 private String respuesta;
 private RemovedorDatos rm;
 private String usuario;
public CarroWeb(){}
public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo
public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo.
public void Remueve(Articulo libro){}
public void Remueve(ArticuloGadget gadget){}
public void RemueveTodo(){}
public float Total(){}
public String CompletaCompra(float credito){}


RemovedorDatos
public class RemovedorDatos 

 private Connection conn;
 private PreparedStatement pst;
 private Manejador bd;

public RemovedorDatos(){}
public void RemueveGadget(ArticuloGadget gadget){}
public void RemueveLibro(Articulo libro){}
public void RestaCredito(float cantidad, String usuario){}


Manejador
public class Manejador {
 
 private String bdDriver, dataSource;
 private String bdName, user, pass;
 private Connection conn;
 private String encryp;

public Manejador(){}
public Connection abreBD() {}
public String getEncryp(){}
public void Cierra(Connection conn){}


Datos
public class Datos 
 
 private Connection conn;
 private ResultSet rs2;
 private Manejador bd;
 private Usuario dummy;
 private PreparedStatement pst2;
 private Articulo item;
 private ArticuloGadget gadget;

public Datos(){}
public Usuario consigueDatosUsuario(String usuario) {}
public Articulo consigueDatosArticulo(String nombre) {}
public ArticuloGadget consigueDatosGadget(String nombre) {}
public List consigueArticulos() {}
public List consigueGadgets(){}

Documentacion Tecnica

La importancia de la documentacion tecnica

Para entender la importancia de la documentacion veamos un ejemplo.

Imaginemos que somos llamados para realizar nuestras practicas profesionales en la empresa Jcode. En dicha empresa necesitan una minima modificacion a el sistema encargado de las bases de datos de los empleados, ya que el encargado esta de vacaciones y las modificaciones son de prioridad maxima, si el practicante puede implementar dichas modificaciones aseguraria su puesto.

El requisito es el siguiente.
* No permitir que los nombres de los empleados en la base de datos contengan numeros; solo seran permitidios los caracteres.

* No permitir que los campos de nombres y apellidos queden vacios.

Inmediatamente te diriges a modificar el codigo fuente del sistema, y localizas la parte que ejecuta las inserciones a la base de datos.


public class insert {

    String p;
    String l;
    String x;

    EscuchaEventos m = new EscuchaEventos("as"1,true);

    p = m.insen();
    l =    m.insea();
    x =    m.insee();

    basedatos bd = new basedatos();

    bd.upd(p,l,x);

}
Al ver esto cualquiera se asustaria. Las variables no tienen mucho sentido,  no hay forma de saber cuales son los elementos importantes, no tiene metodos implementados. No se sabe si esta clase es necesaria, y al parecer solo el encargado principal, aquel que escribio el codigo es capaz de interpretarlo.

Quiza aun exista manera de arreglarlo, pero ahora imaginen que se quedan con el empleo.
Traten de visualizar todo el codigo igual de codificado, seria una pesadilla, no?

Es por ello que la documentacion tecnica es tan importante, a nivel de proyecto es indispensable mantener una documentacion limpia y clara para poder darle mantenimiento a nuestros propios sistemas o a sistemas ajenos.

Veamos este ejemplo de codigo.

public class Elevator {

  public boolean doorOpen = false; // variable que indica si la puerta esta abierta
  public int currentFloor = 1; // entro que indica el piso actual
  public final int TOP_FLOOR = 4; // Constante donde se indica el maximo de pisos
  public final int MIN_FLOOR = 0; // Constante donde se indica el minimo de pisos

  // Metodo openDoor para abrir las puertas modificando la variable openDoor  

  public void openDoor() {
    System.out.println("Abriendo puerta....");
    doorOpen = true;
    System.out.println("La puerta esta abierta.");
  }

  // Metodo closeDoor para cerrar las puertas modificando la variable openDoor  

  public void closeDoor() {
    System.out.println("Cerrando puerta ....");
    doorOpen = false;
    System.out.println("La puerta esta cerrada.");
  }

  // Metodo goUp para aumentar el currentFloor y desplegar en pantalla el piso actual 

  public void goUp() {
    System.out.println("Subiendo un piso.");
    currentFloor++;
    System.out.println("Estamos en el piso: " + currentFloor);
  }

  // Metodo goDown para decrementar el currentFloor  y desplegar en pantalla el piso acutal 

  public void goDown() {
    System.out.println("Bajando un piso.");
    currentFloor--;
    System.out.println("Estamos en el piso: " + currentFloor);
  }

} 
Al ver un codigo asi es mas facil comprender y modificar su estructura, es un hecho. Como un consejo extra, la documentacion tecnica esta bien acompañada de un estandar de codigo esto hace una lectura y comprension tan sencilla que es facil aplicarles mantenimiento a los sistemas ademas de aplicarles optimizaciones.

Herencia

En mi proyecto Determine que la herencia puede aparecer en la clase Articulo y en los Servlets.

La clase Articulo puede derivar a ArticuloGadget.

Ademas la herencia de los servlets esta implicita, ya que la clase Verificador y la clase Registro heredan de HttpServlet.