viernes, 15 de julio de 2011

Patrones de Diseño

Que es un patron de diseño?
Un patrón de diseño es una solución a un problema de diseño. Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado suefectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.


Los patrones de diseño que utiliza mi proyecto:


Facade(Fachada): Provee de una interfaz unificada simple para acceder a una interfaz o un grupo de interfaces de un subsistemas.


- Este patron me ayudara en lo que es la ventana GUI, ya que ahi lo manejo completamente todo y al momento de ver las tablas o hacer las consultas se abren otras ventanas con ese tipo de informacion.


Flyweight (Peso Ligero): Reduce la redundancia cuando gran cantidad de objetos poseen identica informacion.


- Este me ayudara a lo que cuando se utiliza el statement simplemente lo declaro como 
st = statemente y al momento de mandarlo a llamar solo poner st.


Singleton (Instancia única): Garantiza la existencia de una única instancia para una clase y la creación de un mecanismo de acceso global a dicha instancia.


- Este patron me ayudara en lo que es el main ya que solamente instancia para poder hacer lo que se esta instanciando.


Chain of Responsibility (Cadena de responsabilidad): Permite establecer la línea que deben llevar los mensajes para que los objetos realicen la tarea indicada.


- Este patron lo utilizo en el action performed de la clase GUI ya que como son muchos botones tiene que haber una secuencia de cada uno de ellos al momento de hablar al ActionListener.

Demostración final

Como se pudo apreciar en la clase, me falto mucho por implementar en lo que resta de las vacaciones intentare trabajar en ello para poder hacer un sistema que se aprecie.

Que le falto?
Que se pudiera realizar un prestamo.
Que me cree un pdf para dar el ticket.
Que se puedan realizar consultas de los juegos prestado.
Que aparezca la persona que tiene el juego.


Documentacion al usuario.


Para poder usar este sistema es simple en la ventana GUI se agrego una pestaña llamada ayuda donde usted puede ver que es lo que quiere hacer. 


Como punto numero uno.- Tenemos que usted quiere agregar a alguien como lo hace?, bien se dirige a la pestaña  Catalagos y escoge ya sea juego o clientes y le da click en agregar, aparecera una ventana donde podra llenar los requisitos que se necesitan para poder estar en el sistema.


Punto numero dos.- Como visualizar las tablas de los clientes, se dirige a la pestaña consultas y escoge la seccion de clientes da click en todos y podra visualizar la tabla, para ver la tabla de juegos, se dirige a la pestaña inventarios y le da click en la seccion de juegos usted podra ver los juegos.


Punto tres.- Como realizar un prestamo, se dirige a la pestaña prestamo, y escoge la seccion de realizar prestamo se abrira una ventana en este lugar llenara los requisitos que requiere para hacer el prestamo y le dara al boton imprimir.


Demo

Documentación técnica

Aqui dejo la liga sobre mi documentacion tecnica:
 Esta ligas es de un .RAR
http://www.megaupload.com/?d=61KQK5MB

Auto-generación de código


Lo diferente es que en mi proyecto yo use un actionPerfomed por cada accion que se debia hacer, en el código auto-generado solo tenia uno, en donde abarca todo eso.

En mi caso yo solo compare el ID de la tabla para poder elimnar y el codigo auto-generado lanza gets y sets para poder hacer lo mismo que yo, que quiere decir que me ahorre lineas al momento de agregar o eliminar ya sea un juego o un cliente.

Al comparar mi codigo con el auto-generado si puede haber ciertos aspectos en los que el codigo auto-generado me pueda ayudar, por eso siempre es bueno hacer un diagrama antes de empezar a programar creo yo que que es la mejor maner de empezar un buen sistema

Interfaz Grafica

Aqui les dejo una serie de mis ventanas.

Esta es cuando se va a entrar al sistema:


Aqui la ventana princpal con una tabla:

Esta es cuando no llenas un campo en agregar cliente, te apraece lo siguiente:

Aqui es cuando se llena correctamente los campos de la imagen anterior:

Ventana para eliminar, cuando no se pone nada:

Ventana eliminar cuando si se pone el id:
Y un simple JDialog para mostrar al acerca del Sistema:


Eventos, excepciones y errores

Evento:

Esta parte del codigo es el metodo que se tiene que implementar de ActionListener, el cual va a "escuchar" el menu desplegable de la ventana principale:
public void actionPerformed(ActionEvent ae) {
  if(ae.getSource() == Agregar){
   AgregarCliente a = new AgregarCliente();
  }else if(ae.getSource() == Eliminar){
   EliminarCliente DEL = new EliminarCliente();
  }else if(ae.getSource() == Nuevo){
   //AgregarJuego AJ = new AgregarJuego();
  }else if(ae.getSource() == Borrar){
   //EliminarJuego Bor = new EliminarJuego();
  }else if(ae.getSource() == TC){
   this.fillTable();
   System.out.println("Conectando...");
  }

Este pedazo es sencillo, lo que hace es utilizar un metodo "getSource" del objeto ActionEvent, 
para saber de que boton se produjo el evento, y despues lo que hace es compararlo con  cada uno de los botones disponibles para ver si el evento se produjo de tal boton.  Y asi realizar la accion que tenga ese boton.

Excepciones:
public void actionPerformed(ActionEvent e) {
   JButton b = (JButton)e.getSource();
   if(b==boton_aceptar){
    c = (campocliente.getText());
    t = (campotel.getText());
    d = (campodir.getText());
           l = (campoed.getText());
    u = (campocel.getText());
    r = (camporefe.getText());
     try{
      rows_updated = 0;
      PreparedStatement aux = objeto_base.ct.prepareStatement("INSERT INTO Clientes(Nombre, Edad, Direccion, Telefono, Celular, Referente)VALUES(?,?,?,?,?,?)");
      aux.setString(1,c); 
      aux.setString(2,l); 
      aux.setString(3,d);
      aux.setString(4,t); 
      aux.setString(5,u);
      aux.setString(6,r);
      rows_updated = aux.executeUpdate(); 
       
      JOptionPane.showMessageDialog(this, "Registro Agregado");
      this.setVisible(false);
    
     }catch(SQLException d){
      JOptionPane.showMessageDialog(this, "Error");
     }
  }else if(b==botoncancelar){
   this.setVisible(false);
  }
   
  }
  
 }
 Al igual que en el codigo que mencione arriba, primero fue igualar un boton local con el getSource del ActionEvent, para asi comparar solo botones.
Despues en el Try, lo que hace es prepar la sentencia de SQL para agregar cliente pasandole los parametros que extraje de los campos que lleno el usuario. 
Despues se ejecuta el update y me manda un mensaje de que se pudo hacer.
En el Catch, hay una excepcion del tipo "SQLException" la cual solo mostrara un mensaje  que diga que no se puedo, esto ayuda a que el programa no se quede buscando informacion.

Errores:
Un error que tiene el sistema, es uno simple donde no le pongo que funcionen las teclas por lo
tanto al momento de querer oprimir un boton se tiene que hacer con el mouse.

SISTEMAS DISTRIBUIDOS.

Sistemas distribuidos
Definición:

"Sistemas cuyos componentes hardware y software, que están en ordenadores conectados en red, se comunican y coordinan sus acciones mediante el paso de mensajes, para el logro de un objetivo. Se establece la comunicación mediante un protocolo prefijado por un esquema cliente-servidor".

Características:
    * Concurrencia.- Esta característica de los sistemas distribuidos permite que los recursos disponibles en la red puedan ser utilizados simultáneamente por los usuarios y/o agentes que interactúan en la red.
    * Carencia de reloj global.- Las coordinaciones para la transferencia de mensajes entre los diferentes componentes para la realización de una tarea, no tienen una temporización general, esta más bien distribuida a los componentes.
    * Fallos independientes de los componentes.- Cada componente del sistema puede fallar independientemente, con lo cual los demás pueden continuar ejecutando sus acciones. Esto permite el logro de las tareas con mayor efectividad, pues el sistema en su conjunto continua trabajando.

Sistemas Distribuidos en mi proyecto:

cliente-servidor.
En mi proyecto se pudiera realizar un sistema distribuido cliente-servidor en donde el cliente seriia el dispositivo y se solicita un servicio, luego una maquina seria el servidor.



El cliente pide ver los juegos disponibles con precios actualizados, y un servidor se los proporciona, al igual que si el cliente desea escoger uno, que se conecte a un servidor a donde esta el inventario y que este muestre los juegos disponibles en una lista, existen diferentes categorias de servidores, para mi proyecto se implementaria servidor de bases de datos para poder acceder al inventario.

viernes, 8 de julio de 2011

Especificacion Tecnica

Lo que le falta es poder -agregar, -modificar y -eliminar un videojuego ya que en mi caso estoy manejando dos tablas una de los clientes y otra del inventario en este caso cd's de videojuegos, tambien poder -eliminar y -modificar a un cliente, que los botones de consultas sirvan que me muestren el inventario ya sea por titulos o por clasificacion segun lo desee el usuario.
Tambien me gustaria agregar algo que sea referente a la paga y los dias que se prestara el CD algo mas o menos asi:
$20 = 2 Dias
y que en una seccion de mi ventana principal aparezca esto:
Cliente        CD                  Dias de renta:
nombre        Juego       2Dias(7/07/2011) a (9/07/20011)

A mi pensar creo que eso sera lo mas dificil de hacer. 

Para agregarle funcionalidad a las cosas que me faltan es solo agregar los actionperformed para que funcionen ademas trabajara con los comandos de mysql ya que como habia dicho la persona que use el software querra checar por titulo o por clasificacion segun la necesidad.

DEMO

Ahora explicare los procesos que puede realizar mi programa por el momento, bien mi programa inicia pidiendo el usuario y contraseña antes de poder abrir la ventana principal si son los indicados se abrira y si no lo son te aparecera un aviso en donde te dira que estan incorrectos, tambien puede mostrarme la base de datos que se a realizado previamente en mysql, y agregar a una persona.


 
Esta es la ventana despues de que le oprimi ver tabla


Estas ventanas es cuando oprimo el boton de agregar en el menu catalagos y me pide estos datos y me aparece que el registro a sido agregado.









Aqui aparece el registro agregado.

Herencia y Polimorfismo

Bien esta entrada es para explicar sobre las herencias que tiene mi proyecto, es facil por el momento la unica herencia que estoy usando es la del JFrame ya que todas mis ventanas heredan los parametros de la libreria.

Despues pienso editar la entrada con las otras herencias que vayan surgiendo en el transcurso de mi proyecto.

El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma específica. En general nos sirve para programar objetos con características comunes y que todos estos compartan la misma superclase en una jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programación.
Sugiero que vean la entrega de los esqueletos para que vean de que se habla.Creo que se entiende mejor en el esqueleto de la calase GUI.

Esqueleto del Software

Estos son los esqueletos que llevo por el momento habra mas y al final editare esta entrada para mostrar completamente el esqueleto de mi software, por el momento estos son los que tengo:



public class GUI extends JFrame implements  ActionListener
{
private static final BaseDatos bdm = null;    
private final String [] titulos = {"NOMBRE", "EDAD", "DIRECCION", "TELEFONO", "CELULAR", "REFERENTE", "ID"};
private DefaultTableModel dtm = new DefaultTableModel();
private JTable personTable = new JTable(dtm);
private BaseDatos dbm = new BaseDatos();

private JMenuBar menuBar;
privaterivate JMenu Catalagos,Juegos,Clientes,Inventario,VJ,Prestamos,Clientela,Ayuda,Consultas;
private JMenuItem Salir,Agregar,Eliminar,Modificar,Nuevo,Otro,Borrar,Todos,PC,PCL,PT,JP,JD,TC,CM,CU,ADprivate JScrollPane scroll;

public GUI(){
 }

public void addComponents(){
}
public void actionPerformed(ActionEvent ae) {
}

//MANEJA LA VENTANA PARA AGREGAR CLIENTES
class AgregarCliente extends JFrame implements ActionListener{
private JLabel cliente, direccion, tel, edad, cel, refe;
private JTextField campocliente, campodir, campotel, campoed, campocel, camporefe;
private JButton boton_aceptar, botoncancelar;
private BaseDatos objeto_base = new BaseDatos();
private String c,d,t,l,u,r, query;

public AgregarCliente(){
}
public void agregarcomponentes(){
}
public void actionPerformed(ActionEvent e) {
}

//MANEJA LA VENTANA PARA ELIMINAR CLIENTES
class EliminarCliente extends JFrame implements ActionListener{
private JLabel text1;
private JLabel text2;
private JTextField campoID;
JButton botonaceptar;
private JButton botoncancelar;
    private String IDString;
    private int IDInt;
    private String query;
    BaseDatos obd = new BaseDatos();    
    
    public EliminarCliente(){
    }
    private void agregarcomponentes() {
        }
    public void actionPerformed(ActionEvent e) {
    }    
}//fin de clase

class ModificarCliente extends JFrame implements ActionListener {
    private JButton botoncancelar, botonaceptar;
    private JLabel texto1;
    private JTexField campoid;
    private String IDString;
    private int IDInt;
    private String query;
    BaseDatos obd = new BaseDatos();
    
    public ModificarCliente() {    
    }
        private void addComponents{                
        }

        public void actionPerformed(ActionEvent e){
        }      
}//fin de clase



En este Esqueleto agregue varias clases para que sea mas facil acceder a ellas pero quizas cammbie.




public class BaseDatos {
    private final static String DRIVER = "com.mysql.jdbc.Driver";
    private final static String BD = "jdbc:mysql://localhost:3306/Su base de datos";
    private final static String USER = "root";
    private final static String PASS = "Su Contraseña";    
    public String usuario;
    public String contra;

    Connection ct; //Variable para la conexion
    Statement st; //Para consultas

    //Constructor
    public BaseDatos()
    }//fin constructor

     public void MostrarTodo(){
     }
        public Statement getSt() {
        return st;
    }
}








public class login extends JFrame implements ActionListener{
    private String usuario;
    private String contra;
    private JButton btninicio;
    private JButton btncancelar;
    private JLabel texto1;
    private JLabel texto2;
    private JTextField campouser;
    private JPasswordField campopas;
    private BaseDatos cosa = new BaseDatos();
    private String u,p;
    
    public login(){
    }
    public void Ventlogin(){
    }
        public void actionPerformed(ActionEvent e) {
    }
}





public class main {

public static void main(String[] args) {
BaseDatos bdm = new BaseDatos();
login x = new login();
GUI g = new GUI();
}
}

Seleccion e Instalacion de herramientas

Saludos doctora y  compaeñeros, en esta entrada explicare las herramientas a utilizar por mi parte.

Ahora mencionare que lo que se utilizara:
Como lenguaje utilizare: Java.
Como base de datos utilizare: MySQL.
Como lugar de trabajo utilizare el: Gedit Text Editor ( ya que me siento mas comodo trabajando aqui, tambien se podria utilizar la terminal).
Como sistema operativo utilizare: Ubuntu ( ya que en estos semestres e estado trabajando en este sistema y es muy accesible al momento de instalar o de programar algo).

Bien pasemos a como instalar Java, esto es facil ya que como mencione ubuntu tiene la facilidad de que se pueden instalar cosas con tan solo abrir la terminal y teclear:

sudo apt-get install nombre de lo que instalaras

En este caso instalaremos el Java opend jdk entonces se pone:

sudo apt-get install openjdk-6-jdk

damos enter y por si solo empezara a instalarse en ubuntu.
Se nos preguntara si deseamos continuar oprimimos la tecla Y luego enter y despues de unos segundos queda instalado.

Ahora para instalar Mysql es lo mismo solamente que cambiara el nombre de lo que instalaremos en este caso es:
sudo apt-get install mysql-server
sudo apt-get install mysql-admin
Practicamente sucede lo mismo que con java despues del comando tecleamos enter y empezara la instalacion.

Para poder realizar nuestras conexiones aun falta algo que es:
descargar unas librerias de esta pagina http//dev/mysql.com/downloads/connector/j.

Cuando se descargues esto se descomprime el archivo que sea tar.gz yse debe de utilizar el siguiente comando para ya poder hacer nuestras conexion JDBC claro esta moviendonos desde la terminal donde se encuentre nuestro archivo y es el :
sudo mv mysql-connector-java-5.1.16 /usr/lib/jvm/java-6-openjdk/jre/lib/ext.

Para realizar mis programas utilizo el gedit este se encuentra ya en ubuntu, para buscarlo es aplicaciones(aplications)->accesorios(accesories)->gedit en el menu de ubuntu.
Para lo que es el sistema operativo pueden hacer una memoria booteable con WUBI o simplemente particionar su computadora para instalarlo.

Ejemplo de una clase en java
import java.util.*; 
public class Suma { 
public static void main(String args[]) { 
int num1, num2; 
int sum = 0; 
Scanner console = new Scanner(System.in); 
System.out.println("Dame el primer numero"); 
num1 = console.nextInt(); 
System.out.println("Dame el segundo numero"); 
num2 = console.nextInt(); 
System.out.println("Sum = " +getSum(num1,num2)); 
} 
public static int getSum(int n1, int n2) {
return n1 + n2; 
} 
}

Un ejemplo simple y esto es lo que genera_

Aqui le dejo una liga de un tutorial de java:
http://www.chuidiang.com/java/index.php