jueves, 14 de julio de 2011

Auto-generacion de codigo

Bueno primero que nada solo de las clases hechas con la herramienta CASE solo agrege las mismas que logre hacer debido al poco tiempo, las clases con las que trabaje son Empleados,Habitaciones y la base de datos. Que cambio a comparacion del codigo generado por la herramienta? Primero que nada tenia 2 clases una llamada Habitacion y la otra Habitaciones al ir codificando me di cuenta de que no habia necesidad de tener estas dos clases separadas ya que estaban muy relacionadas y dependian una de la otra y termino siendo una sola clase. En la base de datos en el diagrama no tenia bien definido todo lo que se hiba a hacer, en el codigo ya toda la estructura tomo forma para tener todos los metodos que nos sirven para almacenar toda la informacion que necesitamos. Otro cambio notable puede ser los nombres de los metodos y atibutos muchos si cambiaron por cuestiones de tener muchas cosas parecidas decidi ser mas especifico con los nombres entonces se vieron modificados algunos, algunos otros si fueron respetados del diagrama original. En cuanto a la reserva tenia pensado implementarla pero tambien por cuestiones de tiempo ya no me fue posible pero mas o menos pienso que tambien hubiera estado en la clase habitacion siendo solo otro estado de disponibilidad no es necesario tener otra clase. Otra cosa que veo que cambio son los tipos que maneje en el diagrama ya que al momento de hacerlo no estaba muy seguro de como hiba a funcionar y al momento de codificar ya te das cuenta de realmente que tipo necesitan sea String,int o alguno otro. Eso seria todo los cambios mas notable que noto entre los codigos.




Este es el codigo generado con Umbrello la herramiento CASE que yo utlice


public class Empleados {
private String Altas;
private String Bajas;
private String Informacion;

public Empleados () { };//Constructor
private void setAltas ( String newVar ) {
Altas = newVar;
}
private String getAltas ( ) {
return Altas;
}
private void setBajas ( String newVar ) {
Bajas = newVar;
}
private String getBajas ( ) {
return Bajas;
}
private void setInformacion ( String newVar ) {
Informacion = newVar;
}
private String getInformacion ( ) {
return Informacion;
}

public String ObtenerDatos( )
{
}//Fin obtenerdatos
public String Eliminar( )
{
}// Fin Eliminar
public String VerInformacion( )
{
}//Fin Verinformacion
}//Fin clase Empleados

public class Habitacion {

private int Disponibilidad;

public Habitacion () { };

private void setDisponibilidad ( int newVar ) {
Disponibilidad = newVar;
}//Fin setDisponiblidad

private int getDisponibilidad ( ) {
return Disponibilidad;
}//Fin getDisponibilidad

public void CheckIn( )
{
}//Fin CheckIn

public String CheckOut( )
{
}//Fin CheckOut

public void Reservar( )
{
}//Fin Reservar


}//Fin clase Habitacion

public Habitaciones () { };//Constructor

private void setDisponibilidad ( int newVar ) {
Disponibilidad = newVar;
}

private int getDisponibilidad ( ) {
return Disponibilidad;
}

public int MuestraDisponible( )
{
}//Fin MuestraDisponible

public int Muestra_Ocupado( )
{
}//Fin MuestraOcupado

public int MuestraReservada( )
{
}//Fin MuestraReservada

}//Fin Habitaciones


import java.util.*;


public class BaseDatos {

public BaseDatos () { };



}


Este es el codigo que realice yo
Para la base de datos:


import java.sql.*;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.ResultSet;


public class basedatos// Inicia Clase basedatos//
{
MysqlDataSource datasource;
private Connection basedatos;
private Statement st;
String estado= "Conexion Satisfactoria";

public basedatos()//Constructor con datos para conectar a la base de datos//
{
datasource = new MysqlDataSource();//Conexion a la base de datos de nombre Hotel//
datasource.setUser("root");
datasource.setPassword("68952043");
datasource.setDatabaseName("Hotel");
datasource.setServerName("localhost");
try{
basedatos = datasource.getConnection();
st= basedatos.createStatement();
}catch(Exception e){
System.out.println("No se pudo conectar a la base de datos");//En caso de no conectarse manda la siguiente excepcion//
}
}//fin de constructor(BaseDatos)

public void agregar(String NombreE,int Edad,String Puesto)//Metodo para agregar un empleado//
{
try{
st.executeUpdate("INSERT INTO Empleados(Nombre,Edad,Puesto) VALUES('"+NombreE+"','"+Edad+"','"+Puesto+"')");
}catch(SQLException ex){
estado = ex.getMessage();
}
}//Fin agregar//
public ResultSet buscar(String search)//Metodo para buscar un empleado//
{
ResultSet resultado = null;
try{
resultado = st.executeQuery("Select * from Empleados Where Nombre = '"+search+"'");
}catch(SQLException ex){
estado = ex.getMessage();
}
return resultado;
}//fin buscar//
public void Modificar(String NombreMod,String NombreM,int EdadM,String PuestoM)//Metodo para Modificar la informacion del empleado//
{
try {
st.executeUpdate("UPDATE Empleados SET Nombre='"+NombreM+"',Edad='"+EdadM+"', Puesto='"+PuestoM+"' WHERE Nombre='"+NombreMod+"'");
} catch (SQLException ex) {
estado=ex.getMessage();
}
}//Fin Modificar//
public void Eliminar(String Elim)//Metodo para eliminar empleados//
{
try{
st.executeUpdate("DELETE FROM Empleados WHERE Nombre='"+Elim+"'");
}catch(SQLException ex){
estado = ex.getMessage();
}
}//Fin Eliminar//

public void VerEmpleados(){//Metodo para ver todos los empleados//
try{
ResultSet rs = st.executeQuery("SELECT * FROM Empleados");
while(rs.next()){

System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
}catch(Exception e){
System.out.println("Error al realizar la consulta");
}
}//Fin VerEmpleados//

public void VerHabitaciones(){//Metodo para ver todas las habitaciones con su estado//
try{
ResultSet rs = st.executeQuery("SELECT * FROM Habitaciones");
while(rs.next()){

System.out.println(rs.getString("Numero")+" "+rs.getString("Estado")+" "+rs.getString("Costo"));
}
}catch(Exception e){
System.out.println("Error al realizar la consulta");
}

}//Fin VerHabitaciones//


public ResultSet Asignacion(int Prec){// Metodo para asignar una habitacion al cliente//
ResultSet pre=null;
try{
pre=st.executeQuery("Select * from Habitaciones Where Estado='Vacia' AND Costo="+Prec);

}catch(SQLException ex){
System.out.println(ex.getMessage());
}
return pre;

}//Fin Asignacion

public void Cam(String Num,String NomC,int Dias){//Metodo para cambiar el estado de la habitacion//

try{
st.executeUpdate("UPDATE Habitaciones SET Estado='Ocupada', Dias='"+Dias+"',Nombre='"+NomC+"' WHERE Numero='"+Num+"' ");

}catch(SQLException ex){
System.out.println(ex.getMessage());
}


}//Fin Cam//


public ResultSet Ocupada(int num){// Metodo para buscar una habitacion ocupada//
ResultSet nm=null;
try{
nm=st.executeQuery("Select * from Habitaciones Where Estado='Ocupada' AND Numero="+num);

}catch(SQLException ex){
System.out.println(ex.getMessage());
}
return nm;

}//Fin Asignacion
public void Salida(String nume,String nom){//Metodo para cambiar el estado de la habitacion//

try{
st.executeUpdate("UPDATE Habitaciones SET Estado='Vacia', Dias='0',Nombre='' WHERE Numero='"+nume+"' AND Nombre='"+nom+"' ");

}catch(SQLException ex){
System.out.println(ex.getMessage());
}


}//Fin Salida//





}//Fin Clase BaseDatos//



Para Habitacion y Empleados:


import java.io.*;
import java.sql.ResultSet;
import java.util.*;
public class Hotel{
public static void main(String[] args)throws Exception{//MAIN//
Scanner Lectura= new Scanner(System.in);//Declaracion de Lector//
basedatos con = new basedatos();
basedatos bdm = new basedatos();

int opci=0;
do{
System.out.println("\nMenu\n1.Archivo de Empleados\n2.Habitaciones\n3.Salir");
opci = Integer.parseInt(Lectura.nextLine());
switch(opci){
case 1:
int opcion=0;
do{
imprime("\nMenu Empleados");//Menu Empleados//
imprime("1.-Agregar Empleado");
imprime("2.-Buscar Empleado");
imprime("3.-Modificar Informacion de Empleado");
imprime("4.-Dar de baja Empleado");
imprime("5.-Ver Todos los Empleados");
imprime("6.-Volver al Menu principal");
opcion= Integer.parseInt(Lectura.nextLine());
switch(opcion)
{
case 1: //caso 1 Agregar Empleado//
imprime("Ingrese la siguiente informacion");
imprime("\nNombre: ");

String NombreE = Lectura.nextLine();
imprime("Edad: ");

int Edad = Integer.parseInt(Lectura.nextLine());

imprime("Puesto: ");
String Puesto = Lectura.nextLine();
con.agregar(NombreE,Edad,Puesto);
break;

case 2://caso 2 Buscar Empleado //
imprime("\nIngrese el nombre del Empleado a buscar: ");
String search = Lectura.nextLine();
ResultSet resultado=con.buscar(search);
if(resultado.next())
{
imprime("\nNombre: "+resultado.getString("Nombre"));
imprime("Edad: "+resultado.getString("Edad"));
imprime("Puesto: \n"+resultado.getString("Puesto"));
}else
imprime("Empleado no encontrado verifique la informacion");
imprime(con.estado);
break;

case 3://caso 3 Modificacion//
imprime("\nIngrese el Nombre del Empleado cuya informacion desea Modificar: ");
String NombreMod =Lectura.nextLine();
ResultSet res=con.buscar(NombreMod);
if(res.next())
{
imprime("\nIngrese la nueva informacion");
imprime("Nombre: ");
String NombreM=Lectura.nextLine();
imprime("Edad: ");
int EdadM= Integer.parseInt(Lectura.nextLine());
imprime("Puesto: \n");
String PuestoM=Lectura.nextLine();
con.Modificar(NombreMod,NombreM,EdadM,PuestoM);
}else
imprime("Empleado no encontrado verifique la informacion");
imprime(con.estado);
break;

case 4://caso 4 Eliminar//
imprime("\nIngrese el nombre del Empleado a eliminar: ");
String Elim = Lectura.nextLine();
ResultSet resu= con.buscar(Elim);
if(resu.next())
{
con.Eliminar(Elim);
}else
imprime("Empleado no encontrado verifique la informacion");
break;
case 5://caso 5 VerEmpleados//
imprime("\n");
bdm.VerEmpleados();
break;
}//Fin Switch

}while(opcion!=6);//Fin Do while//
break;


case 2:
int opcion2=0;
do
{
imprime("\nMenu Habitacion");//Menu Habitacion//
imprime("1.-Check In");
imprime("2.-Check Out");
imprime("3.-Ver Todas las Habitaciones");
imprime("4.-Volver al Menu principal");
opcion2= Integer.parseInt(Lectura.nextLine());
switch(opcion2)
{
case 1: //Check In//
imprime("Ingrese la siguiente informacion");
imprime("Ingrese el numero de la habitacion deseada\nTipo de Habitacion\n1.-Sencilla $100\n2.-Doble $300\n3.-Suite $600");
int Prec = Integer.parseInt(Lectura.nextLine());
if(Prec==1){
Prec=100;

}
if(Prec==2){
Prec=300;

}
if(Prec==3){

Prec=600;
}
ResultSet Tipo=con.Asignacion(Prec);
if(Tipo.next())
{

imprime("Habitacion Disponible");
imprime("\nCuarto: "+Tipo.getString("Numero"));
String Num=Tipo.getString("Numero");
imprime("Estado: "+Tipo.getString("Estado"));
imprime("Precio:"+Tipo.getString("Costo"));
imprime("\nNombre del cliente");
String NomC=Lectura.nextLine();
imprime("Ingrese los dias de estancia");
int Dias= Integer.parseInt(Lectura.nextLine());
int Total=Prec*Dias;
imprime("El total a pagar es de $"+Total);
con.Cam(Num,NomC,Dias);


}else imprime("No hay cuartos de ese tipo disponible");

break;

case 2://Check Out//
imprime("Ingrese el numero de la habitacion de la cual sale el cliente");
int num=Integer.parseInt(Lectura.nextLine());
ResultSet oc=con.Ocupada(num);
if(oc.next())
{
imprime("Informacion de Habitacion a dar de baja");
imprime("\nCuarto: "+oc.getString("Numero"));
String nume=oc.getString("Numero");
imprime("Estado: "+oc.getString("Estado"));
imprime("Nombre:"+oc.getString("Nombre"));
String nom=oc.getString("Nombre");

con.Salida(nume,nom);
}else imprime("Esa habitacion no esta ocupada");
break;

case 3://caso 3 VerHabitacion//
imprime("\n");
bdm.VerHabitaciones();
break;
}//Fin Switch

}while(opcion2!=4);//Fin Do while//
break;

}//Fin Switch//

}while(opci!=3);//Fin Do while//
}//Fin Main











public static void imprime(String imprime)//Metodo para ahorrar codigo a la hora de Imprimir//
{
System.out.println(imprime);
}//fin de Impresor//




}//Fin clase Hotel

Retroalimentacion del curso

En esta entrada hablare un poco de lo que entendi de cada tema que vimos en la clase. Primero que nada la definicion del proyecto, para poder enfocar bien lo que queremos hacer antes que nada debemos pensar en lo que queremos para que nos serviria mas que nada definir bien nuestras ideas. Una ves definidas nuestras ideas sacamos nuestros casos de uso asi podremos saber quien los usara que vendrian siendo los actores para despues sacar en otras palabras las fucniones del programa.

Despues vimos las clases las clases nos sirven para dividir las funcionalidades para la hora de codificar no oscurecer nuestro codigo, recordemos que las clases son publicas y las reconocemos como sustantivos,sus atributos son privados y los reconocemos como caracteristica y sus metodos publicos los cuales reconocemos como verbos. La herencia nos sirve para poder utilizar metodos de otras clases en alguna de nuestras clases. Los diagramas de clases se deben hacer con herramientas case para poder definirlos bien con sus debidos comentarios y multiplicidad.

En cuanto a la documentacion tecnica esta es muy importante en la rama de la programacion porque si no documentamos bien nuestro programa alguien mas que trabaje con el podria no entenderlo, por eso siempre debemos documentar bien por que no sabemos quien mas valla a modificar informacion dde nuestro codigo.

Sobre los diagramas de secuencia estos nos sirven para mostrar un caso en especifico como funciona paso a paso como se comunica con todas las clases. Los eventos,excepciones y errores nos ayudan a identificar posibles errores que pudieran suceder cuando utilizamos los botones de nuestra interfaz grafica.

Ya por ultimo cubrimos los temas de pruebas unitarias los cuales nos sirven para probar las funcionalidades de nuestro programa una por una y detectar que su funcionamiento sea correcto.

Pruebas Unitarias

En esta tabla se muestra la primer prueba unitaria que viene siendo sobre el funcionamiento correcto del check In.


En esta otra Tabla la prueba unitaria es para verificar el funcionamiento del check out.

Por ultimo en esta tabla la prueba unitaria vendria siendo para verificar el funcionamiento de agregar los empleados a la base de datos.

Interfaz Grafica

Esto vendria siendo la ventana de login y la ventana de el administrador la cual contendria las tabs y segun la que este seleccionada se desplegaria la informacion.



Esta vendria siendo la ventana del cliente donde tambien contendria 2 tabs y serian para desplegar la informacion de la habitacion dias restantes y la otra para algun servicio extra.

Eventos,Excepciones y Errores

Estos vienen siendo los Eventos,Excepciones y Errores que pueden ocurrir en la ventana que genere de log in.

Eventos


Excepciones y Errores

Sistemas Distribuidos

Con base a lo que vimos en clase mi proyecto podría considerarse un sistema distribuido atravez de internet. Como podría implementar esto? Primero que nada habría que considerarse ciertos aspectos como por ejemplo si ya está apto para ser distribuido, en caso de que lo considere así habría que colocar algún tipo de manual de usuario porque mi programa está enfocado a lo que sería el manejo de un Hotel y probablemente tal vez en algún lugar si se quisiera probar cuente con mas habitaciones, entonces su base de datos tendría que contener mas cuartos o aspectos de este tipo que pueden variar, entonces habría que incluir un manual para que sea entendible el manejo del mismo sistema y se pueda implementar correctamente. En el aspecto de seguridad pues también depende de que tantas cuentas de administrador se quieran tener se tendria que modificaresa información.

miércoles, 13 de julio de 2011

Patrones de Diseño

Los patrones de diseño que creo podrian aplicar en mi proyecto serian los siguientes.
Primero que nada Singleton en caso de que consiga terminar el login en el que estoy trabajando, Para que nos sirve el Singleton? El singleton nos permiete la existencia de una sola instancia para una clase y un mecanismo de acceso global que en este caso seria la cuenta de login.Otro patron podria ser el Command con la cual podriamos registrar por ejemplo los servicios que quisiera el Cliente en su habitacion aemas de deshacer las operaciones.

Referencias:
http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o
http://software.guisho.com/wp-content/uploads/2009/05/lego.jpg