viernes, 15 de julio de 2011

Demostracion Final

Aqui dejo lo que son mis ligas de Documentacion y del codigo fuente:

Codigo Fuente
En caso de no funcionar el link de megauplod esta es otra opcion:Codigo Fuente

Y aqui el manual de usuario:Manual


Eventos, excepciones y errores

Las excepciones que maneje en mi programa fueron las siguientes
Aqui un ejemplo:
En este ejemplo la Excepcion que se maneja es que en caso de que no se pudiera hacer una conexion con la base de datos te arrojaria el mensaje de que no se pudo conectar.Esta excepcion fue la que use en todo lo que inclucraba hacer modificaciones a la base de datos para saber si se habia ingresado correctamente la informacion.


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//


Aqui podemos ver que si no logra hacer lo que se pide arrija la excepcion que mostre antes y si si lo logra arroga el mensaje de estado que fue declarado como conexion satisfactoria.


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//

En general solo maneje esto de excepcion solo para confirmar la conexion con la base de datos si era correcta o incorrecta asi que todos mis campos de modificacion de la base de datos incluyen esas sentencias.


En cuanto a los errores en este ejemplo tenemos que se busca un empleado a eliminar si existe entraria al if pero en caso de no existir arrojaria el mensaje de error de que no fue encontrado verificar la informacion. De igual forma la mayoria de los errores que maneje fueron de este tipo de retornar un mensaje con verificar la informacion.


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");


Eventos
Para los eventos solo podria incluir lo que seria en mi caso que no pude realizar la interfaz pues lo que vendria siendo el switch case.Como vemos el switch es de la variable opcion en caso de que sea digamos el Caso 1 el evento que se desencadenaria seria el siguiente ejemplo.

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;

Sistemas distribuidos Taller

Para poder distribuir mi software primero que nada creo que habria que terminarlo e implementar la interfaz grafica para que sea de facil manejo. Otro punto es que necesitaria ser open-source y atraves de internet para que se pueda adaptar segun al hotel que se quiera usar ya que yo en mi ejemplo solo manejo 15 habitaciones y 3 tipos pero esta informacion puede variar. Habria tambien que disenar un manual de usuario donde se incluyeran las especifaciones para poder usarlo como lo que se requiere que seria java ya al momento de hacerlo como un ejecutable sin necesidad de la termina, esto ya con la idea de que este termindo completamente, otro aspecto para distribuirlo bien seria gratis tambien. Por ultimo la seguridad habria que disenar un login para que solo los administradores tengan acceso a el programa.

Pruebas Unitarias Taller

Aqui unas capturas del resultado de las pruebas sobre mis clases hecho con Junit





Tambien las pruebas que habia planeado hacer en la clase


Aqui comprobe que realmente funcionara y la pueba fue exitosa al momento de hacer check in se obtienen los datos y se cambia el estado por Ocupada.





Aqui comprobe que realmente funcionara y la pueba fue exitosa el estado vuelve a "Vacio" y los datos se reinician.



Aqui comprobe que realmente funcionara y la pueba fue exitosa los datos de empleado que se proporcionan son agregados a la tabla.

Patrones de diseño Taller

Bueno un patron de diseño que implemente en mi codigo fue:
Flyweight (Peso ligero): Reduce la redundancia cuando gran cantidad de objetos poseen idéntica información. Utlice esto para ahorra escribir todo el System.out.println a la hora de querer imprimir algo en la pantalla de esta forma solo colocando imprime llamo a lo que es el System.out.println. Aqui el codigo de donde lo utilice

La declaracion

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


Y a la hora de querer usarlo solo lo mandamos a llamar a como lo hayamos definido en este caso "imprime"


imprime("Habitacion Disponible");
imprime("\nCuarto: "+Tipo.getString("Numero"));
String Num=Tipo.getString("Numero");
imprime("Estado: "+Tipo.getString("Estado"));

Interfaz Grafica Taller

Desafortunadamente por el tiempo de entrega y problemas que surgieron con la base ya no me dio tiempo de implementar la interfaz grafica que tenia en mente, asi que solo dejo las capturas de la Terminal de los Menus que le hice para poder hacerla funcionar.

El menu principal


El menu de Empleados


El menu de habitaciones

Documentacion Tecnica Taller

Aqui esta la liga con la documentacion de mi proyecto realizada con javadoc:
Descarga Aqui(El zip incluye ambos archivos):
Documentacion

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

domingo, 10 de julio de 2011

Diagramas de Secuencia

Los diagramas de secuencia nos muestran la interaccion de conjuntos de objetos en una aplicacion a traves del tiempo y se modela usando los casos de uso de un sistema.

Para mi proyecto estos son algunos diaagramas de secuencia

Para la Disponibilidad de las habitaciones:


Para los Gastos:

Es muy sencillo este diagrama simplemente con base a la seleccion de tipo de habitacion y algun otro gasto extra el sistema simplemente regresa al usuario/cliente la suma del total a pagar.



Para los Empleados:

Este caso fue en el que trabaje para mi demo que simplemente es que el sistema despliega un menu con opcion para este diagrama solo trabaje en lo que seria agregar un empleado el sistema pide la informacion el administrador la ingresa y el sistema la envia a guardar en la base de datos.


Referencias:
http://es.wikipedia.org/wiki/Diagrama_de_secuencia

sábado, 9 de julio de 2011

Extra-Clase Analizar la Interfaz de un videojuego

Bueno para esta entrada extra decidí analizar la interfaz grafica de un videojuego llamado “League of Legends” les incluiré las fotos también para que puedan apreciarlo también para los que tal vez no conozcan el juego.


Primero que nada tenemos la interfaz principal la cual para mi gusto me parece muy bien diseñada contiene diferentes elementos que la hacen muy llamativa sobre todo por el uso de flash que hace que no sea una imagen fija y este cambiando constantemente, obviamente también se incluye el nombre y logotipo del juego en la esquina de arriba izquierda, las noticias relevantes del juego el estado del servidor que puede variar si está fallando o está en línea disponible para jugar y el botón de play que nos lleva a la siguiente ventana que viene siendo el login.



La pantalla del login no contiene muchas cosas ya que solo sirve más que nada para ingresar al juego con nuestra respectiva cuenta y pues también las clásicas opciones que se nos proporcionan en la mayoría de los login como olvide mi contraseña o usuario y nos manda a los links de recuperación, en la imagen no se puede apreciar pero también está hecha con animación tiene la opción de deshabilitar la animación en caso de que no tengamos un equipo que la soporte muy bien y nos esté dando problema para eso son las casillas de abajo en la esquina derecha la cual también tiene una opción de deshabilitar la música que contiene esta ventana.


Y por ultimo lo que vendría siendo ya la interfaz interna del juego también muy completa nuevamente con animaciones se nos muestra las noticias más relevantes al igual que las de la ventana de inicio, los botones de iniciar algún juego o de ingresar a la tienda del juego, botones de ayuda además de una lista de amigos en mi opinión muy completa la interfaz del juego. Por último les dejo en las referencias la página del juego por si les interesa.


Referencias:
http://www.leagueoflegends.com/

Especificación técnica

Lista de funcionalidades que aún no están completas
Para mi proyecto aun me faltan varias cosas por ejemplo en la clase que estuve trabaando para esta demostracion la de empleados faltaria validar los datos que se ingresan ademas de las otras opciones del menu que son modificar la informacion,eliminar y visualisarla desde la base de datos.
Tambien falta trabajar en las demas clases una de las mas importantes la de Habitaciones ya que esta es vital para la funcionalidad del hotel que es poder Hospedarse,Salir y reservar una habitacion.
Y por ultimo lo que serian los costos de las habitaciones que se muestre el total para el cliente.
La conexion con la base de datos ya esta hecha.

Para cada funcionalidad, qué falta para completarla.
En lo de empleados como ya explique faltaria validar las casillas y agregar las funcionalidades faltantes del menu y el resto de las clases faltaria practicamente trabajar en todas ellas.

Para cada funcionalidad, qué van a hacer para terminarla.
En la clas empleados necesito investigar un poco mas sobre lo de validacion para ver como puedo evitar que se ingresen caraceteres indevidos y sobre los de las habitaciones aun no decido si yo mismo le dare las opciones por semanas ya predefinidas para evitar el ingreso de caracteres ya que es una parte muy importante.
En costos tengo que trabajar totalmente en la clase y definir los precios que le dare a las habitaciones y los extras que pondre.

Herencia Proyecto

Para mi proyecto la herencia sera basicamente como muchos la conexion con la base de datos como lo muestro un ejemplo de la siguiente clase de Habitacion que la informacion que se obtenga del cliente que se ospeda sera enviada a la base de datos.



public class Habitacion extends BaseDatos {

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

Demostración de avance parcial

Bueno para mi demo trabaje en la clase empleados y en la conexion con la base de datos basicamente lo unico que hace hasta ahorita es pedir los datos de lo que va a ser el menu de la clase empleados solo funciona el agregar empleado la opcion numero 1 pide los datos que son el Nombre,La Edad y el puesto en el que labora. Los campos aun noe stan validados por si se ingresa algun otro tipo de dato que marque error trabajare en eso mas adelante. Es todo por ahora les dejo el codigo del avance y algunas fotos del funcionamiento.

import java.util.*;
public class Empleados{
public static void main(String[] args)
{
Scanner Lectura= new Scanner(System.in);//Declaracion de Lector//
int Opcion=0;
imp("Conectando a la Base de Datos");
conexion con = new conexion();//Conexion con BD//
imp(con.estado);

do//Menu Empleados//
{
imp("1.Agregar Empleado");
imp("2.Buscar Empleado");
imp("3.Eliminar Empleado");
imp("4.Ver Lista de Empleados");
imp("5.salir");
imp("Elije una opcion: ");

Opcion= Integer.parseInt(Lectura.nextLine());

switch(Opcion)//Switch//
{
case 1://caso1 Agregar Empleado//
imp("Ingrese la siguiente Informacion");
imp("Nombre Completo");
String NombreE= Lectura.nextLine();

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

imp("Puesto de Trabajo");
String Puesto= Lectura.nextLine();
con.agregar(NombreE,Edad,Puesto);
break;

//case 2://caso2 Buscar Empleado//
//imp("Nombre Del Empleado a Buscar:");
//String search= Lectura.nextLine();
//ResultSet resultado = con.buscar(search);
//if(resultado.next())
//{
//imp("Nombre: "+resultado.getString("Nombre"));
//imp("Edad: "+resultado.getString("Edad"));
//imp("Puesto: "+resultado.getString("Puesto"));
//}else imp("No Existe");
//imp(con.estado);

}//Fin de swtich

}while(Opcion!=5);//fin do while//

}//fin de main






public static void imp(String Impresion)//Impresor//
{
System.out.println(Impresion);
}//fin de Impresor//


}//fin de clase Principal//


import java.sql.*;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class conexion
{
MysqlDataSource datasource;
Connection conexion;
Statement st;
String estado= "Conexion Satisfactoria";

public conexion()
{
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{
conexion = datasource.getConnection();
st= conexion.createStatement();
}catch(SQLException ex){
estado=ex.getMessage();
}
}
public void agregar(String N, int E, String P)//Atributo para agregar Empleados a la base de datos//
{
try{
st.executeUpdate("INSERT INTO Empleados(Nombre,Edad,Puesto) VALUES(' "+N+" ', '"+E+" ', ' " +P+"' )");//insertando los valores a la tabla empleados//
}catch(SQLException ex){
estado=ex.getMessage();

}

}//fin de constructor(conexion)

//public ResultSet buscar(String s)
//{
//ResultSet resultado= null;
//try{
//resultado = st.executeQuery("Select *from Empleados Where Nombre='"+s+"'");
//}catch(SQLException ex){
//estado=ex.getMessage();
//}
//return resultado;
//}//fin ResultSet//

}//fin de clase


Aqui nos aparece el menu principal



Ingresamos los datos que se nos piden.



Y por ultimo aqui podemos ver como nos lo almacena en la tabla de empleados de mi base de datos llamada Hotel.

Esqueleto Clases

Bueno aqui dejo el esqueleto de las clases que usare en mi proyecto

La clase costos la cual usare para todo lo relacionado con los gastos del hotel



class Costo {
public Costo () { };


private void setCargos ( float newVar ) {
Cargos = newVar;
}//Fin setCargos

private float getCargos ( ) {
return Cargos;
}//Fin getCargos


protected float SumaTotal( )
{
}//Fin SumaTotal


}//Fin Clase Costo


La clase Empleados en la cual manejare los empleados que trabajan en el hotel visualisarlos agregar y modificar su informacion
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




La clase habitacion la cual usare para lo fundamental en el programa que es la entrada y salida del hotel y reserva.


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



La clase de Reservacion la cual recibira la fecha para verficar que no este ocupada y poder reservar
public class Reservacion {

private int Fecha;

public Reservacion () { };//Constructor

private void setFecha ( int newVar ) {
Fecha = newVar;
}

private int getFecha ( ) {
return Fecha;
}

public int ObtenerFecha( )
{
}//Fin ObtenerFecha


}//Fin Reservacion




Por ultimo la clase de habitaciones que simplemente servira para poder visualisar el estado de una habitacion si esta ocupada o libre o reservada.

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

Extra Anti-patrones de diseño

¿Qué es un Anti-Patrón de diseño?

Es un patrón de diseño pero que conduce a una mala forma de solucionar el problema. Al documentarse los anti-patrones, además de los patrones de diseño, se dan argumentos a los diseñadores de sistemas para no escoger malos caminos, partiendo de documentación disponible en lugar de simplemente la intuición.

Anti-patrones de diseño orientado a objetos

Problema del yoyó (yo-yo problem): Consiste en construir estructuras demasiado largas por lo tanto difíciles de entender lo que provoca que el programador tenga que estar cambiando entre el uso de clases. Este antiproblema toma este nombre debido a que el programador requiere estar moviéndose de arriba abajo atraves de todo el código como lo hace un juguete yo-yo.

Poltergeist: Consiste en usar objetos cuyo única funcionalidad es pasar la información a terceros objetos o también emplear métodos simplemente para llamar a otro método esto implica que el código sea mas difícil de leer y que exista código inecesario.

Objeto todopoderoso (god object): Consiste en asignar muchas funcionalidades en una única clase. Un programa estructurado suele estar dividido en varias partes. En el caso de objecto todopoderoso el asignarle todo una clase no permite tener las funcionalidades de nuestro programa dividido en varias clases.

Acoplamiento secuencial (sequential coupling): Consiste en diseñar una clase cuyos métodos requieren ser invocados en un orden determinado.





Referencias:
http://en.wikipedia.org/wiki/Poltergeist_(computer_programming)
http://es.wikipedia.org/wiki/Antipatr%C3%B3n_de_dise%C3%B1o
http://en.wikipedia.org/wiki/Sequential_coupling
http://en.wikipedia.org/wiki/Yo-yo_problem

Patrones de Diseño

Conocidos en ingles como “Design Patterns” son soluciones simples y elegantes a problemas específicos y comunes del diseño orientado a objetos. Son soluciones basadas en la experiencia y que se ha demostrado que funcionan. Es normal que a lo largo de multitud de diseños puede haber problemas que se repitan o que son análogos, es decir, que responden a un cierto patrón. Para eso fueron hechos los patrones de diseño para resolvernos esas taras con una solución necesaria para cada caso.
Ejemplos:

Patrón de creación
Builder. Un Builder nos sirve para separa la construcción de un objeto complejo de su representación, de forma que el mismo proceso de construcción pueda crear diferentes representaciones. Permitie la creación de una variedad de objetos complejos desde un objeto fuente (Producto), el objeto fuente se compone de una variedad de partes que contribuyen individualmente a la creación de cada objeto complejo a través de un conjunto de llamadas a interfaces comunes de la clase Abstract Builder.


¿Qué es un Patrón de Diseño?

Patron de Comportamiento
Observer. Define una dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto cambia de estado se notifica y actualizan automáticamente todos los objetos. El objetivo de este patrón es desacoplar la clase de los objetos clientes del objeto, aumentando la modularidad del lenguaje, así como evitar bucles de actualización (espera activa o polling).


Referencias:
http://www.ingenierosoftware.com/analisisydiseno/patrones-diseno.php
http://es.wikipedia.org/wiki/Builder_(patr%C3%B3n_de_dise%C3%B1o)
http://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o)

Documentacion Tecnica

La documentación Técnica consiste en toda la información que nos explica cómo funciona un sistema como está diseñado y con qué fin. Un documento de este tipo suele contener las características técnicas y la forma de operar del sistema, esta información sirve para darle a entender a las personas que vallan a trabajar con él y de esta forma se le pueda dar mantenimiento.
Existen varios tipos de documentación, está la de los programas la cual explica la lógica de un programa e incluye descripciones, los diagramas de flujo, listado de programas y por último los requerimientos para que pueda ser usado de la manera más optima.

Muchas organizaciones actualmente tienen lo que se conoce como un "programa de documentación", el cual consiste en una política formal cuya documentación se muestra como algo que debe prepararse en forma rutinaria para cada programa de cómputo, archivo y nuevos sistemas.
Otra tipo es el registro físico el cual consiste en un escrito que contiene los siguientes elementos:
Políticas y normas referentes al desarrollo del sistema, su implantación, operación y mantenimiento.
El diseño del sistema de información administrativo.
Procedimientos para instalar el sistema de información administrativo.
Procedimientos para operar el sistema de información administrativo.
Procedimientos para mantener el sistema de información administrativo.

¿Porque es importante la documentación Técnica?

La documentación adecuada y completa, de una aplicación que se desea implantar, mantener y actualizar en forma satisfactoria, es esencial en cualquier Sistema de Información, sin embargo, frecuentemente es la parte a la cual se dedica el menor tiempo y se le presta menos atención.
Siempre se debe documentar un sistema pensando en que no lo usaremos en mucho tiempo ya que si la documentación del sistema es incompleta el diseñador continuamente estará involucrado y no podrá moverse a otra asignación.


Referencias:
http://www.monografias.com/trabajos6/dosi/dosi.shtml

lunes, 4 de julio de 2011

Diagrama de clases y Tarjeta CRC

Diagrama de mi proyecto creado con umbrello:


Tarjeta CRC

Diagrama de clases

Diagrama de mi proyecto creado con umbrello:

domingo, 3 de julio de 2011

Herencia

La relacion de herencia que encontre en las clases de mi proyecto fueron las siguientes:

Tabla de herencias:


Explicacion:
Como podemos ver en la tabla la clase habitación puede heredar 3 opciones que puede ser en caso de que la habitación esté disponible, ocupada o reservada vendría siendo la disponibilidad de la habitación ya después en caso de estar disponible digamos que el actor es el cliente podría reservar o hacer check in en caso de estar ocupada se puede hacer check out y en caso de estar reservada se no se podría hacer check in tampoco también en caso de que el actor sea el administrador podría mirar la disponibilidad de las habitaciones por ejemplo el estado de la habitación número 17 si está reservada y quien hizo la reserva y cuantos días está reservada. En el caso de la clase habitaciones para el tipo de habitación que buscamos si está disponible puede ser una habitación de clase alta, media o baja, después de revisar el tipo de habitación que se desea después se checa su disponibilidad para ver si se puede pasar a hacer el check in, check out o reserva. Para la clase costos podemos tener los costos generados por el gasto del tipo de habitación que tendrían diferentes precios siendo la clase alta la mas cara y la clase baja la de menor costo o algún costo extra que haya realizado el cliente ya después todos los gastos serán sumados al total. En la clase de empleados podemos tener varias opciones pueden ser empleados de limpieza del restaurant de administración o algún otro que aun no sé si agregare esta información será agregada por el administrador junto con los datos y será almacenada en la base de datos del hotel también puede ser vista toda la información de los trabajadores actuales o eliminar algún trabajador de la base de datos.

Casos De Uso

Los casos de uso para mi proyecto son los siguientes:

Tabla de Casos de uso con explicacion


Diagrama de Casos de Uso

Diseño con clases

Diagrama de Clases

En el diagrama el cliente y la administracion son actores solo los inclui para ver como va a estar dividido

Tabla de Clases,Metodos y Atributos con su Visibilidad

A esto tambien faltaria incluir la base de datos del sistema donde se va almacenar toda la informacion de los empleados y clientes.

jueves, 30 de junio de 2011

Ejercicio de Herencias

Identificar Herencias del SIASE


Aqui podemos ver primero que nada las clases y tambien lo que vienen siendo los casos de uso.


Y en esta imagen las herencias de la clase Usuario,Inscripcion y Beca

Interfaces (Puntos Extras)

¿Primero que nada que es una interfaz?
Una interfaz en JAVA se define como una colección de métodos abstractos y propiedades. En ellas se especifica qué se debe hacer pero no su implementación. Serán las clases que implementen estas interfaces las que describan la lógica del comportamiento de los métodos.

En el lenguaje de programación de JAVA, una interfaz es un conjunto de requisitos que deben satisfacer las clases que se ajusten a esa interfaz, además de que las interfaces no se pueden instanciar haciendo así que sus métodos deban ser re-escritos por la clase que lo implemente. Otro aspecto importante de las interfaces en JAVA es que todos los métodos son automáticamente public entonces no es necesario declararlo. Para hacer que una clase implemente a una interfaz, se dan dos pasos:

1. Se declara que la clase tiene intención de implementar la interfaz dada.
2. Se proporcionan definiciones para todos los métodos de la interfaz

El aspecto que tiene una interfaz Comparable es el siguiente en JAVA

Ejemplo.

Public interface Comparable
{
Int compareTo(Object otro);
}

Fuentes:
Horstmann,Cays.S. Core Java 2 Volumen 1-Fundamentos, Pearson Prentice Hall
http://emartini.wordpress.com/2008/09/17/poo-clases-abstractas-interfaces-y-herencia-multiple/

Ejercicio Clases y Casos De Uso

Identificar las Clases, Atributos y Métodos para lo siguiente:
-iTunes
-SIASE
-Angry Birds

Itunes


SIASE


AngryBirds


Casos de Uso

Buscaminas

Descripción:
Encontrar todas las minas lo antes posible sin descubrir ninguna.