sábado, 18 de diciembre de 2010

viernes, 17 de diciembre de 2010

Actividad de la Doceava Semana

Interfaces gráficas de usuario

Para ejemplificar las interfaces gráficas utilicé dos pantallas del proyecto que propuse a realizar.

Pantalla Login
La primera pantalla es la de acceso al sistema (login), en esta pantalla te pide el usuario y password y verfica (aun en proceso) en la tabla de usuario los valores. En caso de login exitoso te redirecciona hacia la pantalla de bienvenida.

El código de esta pantalla esta en la presentación:

Y la captura de pantalla es esta:
Pantalla Bienvenida


La segunda pantalla es la pantalla de bienvenida al sistema, le coloqué un menú bar y varios menús mas con sus respectivos items y para que el fondo no se viera tan solo le coloqué una imagen de java.

El código de la pantalla de bienvenida es:

Y la captura de la pantalla de bienvenida es:

De igual manera el codigo en archivo txt, se puede descargar desde este vínculo:
http://www.4shared.com/file/m5vorIHD/codigo_interfaz_grafica_usuari.html

Los enlaces de las páginas en las que me basé para esta entrada fueron:
http://download.oracle.com/javase/tutorial/uiswing/components/icon.html
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ImageIcon.html
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html
http://download.oracle.com/javase/tutorial/uiswing/components/frame.html

jueves, 16 de diciembre de 2010

Actividad de la Treceava Semana

Sistemas Distribuidos

A continuación se muestra una presentación sobre las diferentes arquitecturas de sistemas distribuidos y se elige una de ellas para que, en dado caso de implementarse el proyecto por medio de sistemas distribuidos se pueda hacer en base a esta.


Los enlaces de donde obtuve información son:
http://chuwiki.chuidiang.org/index.php?title=Sockets_%26_rmi
http://en.wikipedia.org/wiki/Internet_socket
http://www.relativo.com/xcript/scrip-sockets.htm

martes, 14 de diciembre de 2010

Actividad de la Onceava Semana

Pruebas Unitarias

Son pruebas individuales de un método o clase.

El procedimiento de elaboración de estas consiste en:

  • Antes de implementar una determinada funcionalidad, piensa cómo deberías probarla para verificar que se comporta correctamente. Esto permite desarrollar la funcionalidad teniendo las ideas muy claras de lo que debería hacer.
  • Escribe el código que implementa la funcionalidad deseada.
  • Escribe el código de las pruebas inmediatamente después.
  • Ejecuta las pruebas que hiciste.
  • Corrige la unidad de código que implementa la funcionalidad deseada hasta que pase todas y cada una de las pruebas.
  • Al añadir una nueva funcionalidad, repite el ciclo: piensa en cómo probarla, codifica la funcionalidad, codifica las pruebas, ejecuta todas las pruebas que hiciste (nuevas y viejas). No sigas hasta que el código pase absolutamente todas las pruebas.
  • Así una y otra vez para cada nueva funcionalidad que implementes


 

Se han implementado dos clases del proyecto consultoriomédico, las cuales son paciente y medicina, cada una de las cuatro clases tiene 4 métodos, alta, consulta, actualiza y baja. Estas clases tienen una conexión con una base de datos local MySQL y escriben directamente sobre ella.


 

Dado que ambas clases son similares solo pondré el código de una y la de pruebas, de todos modos las clases el código completo junto con los requerimientos se puede descargar de :


 

http://www.4shared.com/file/ULKfcnXj/codigo_pruebas_unitarias.html


 


 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;


 


 

public
class paciente {

    

    protected
int
idPaciente;

    protected String nombre = "";

    protected String apPaterno = "";

    protected String apMaterno ="";

    protected String fechaNacimiento = "";

    protected
int
edad;

    protected String sexo = "";

    protected
int
telefono;

    protected String calle ="";

    protected String colonia = "";

    protected String municipio = "";

    protected String ciudad ="";

    protected
int
cp;

    protected
int
noRegSoc;

    protected String resultado;

    

    public paciente(){

    }

    //Se crea el método de la Alta del paciente

    public
boolean AltaPaciente(int idPaciente, String nombre, String apPaterno,String apMaterno,String fechaNacimiento,

            int edad,String sexo, int telefono, String calle, String colonia, String municipio,

            String ciudad,int cp,int noRegSoc){

        //Se verifica que no haya valores nulos

        if(nombre.length()==0 || nombre==null){

            return
false;

        }else
if(apPaterno.length()==0 || apPaterno==null) {

            return
false;

        }else
if(fechaNacimiento.length()==0 || fechaNacimiento==null) {

            return
false;

        }else
if(sexo.length()==0 || sexo==null) {

            return
false;

        }else{

            try

     {

     /Se intenta hacer el insert del alta

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

     Connection conexion = DriverManager.getConnection (

     "jdbc:mysql://localhost/consultorio","root", "root");

     Statement s = conexion.createStatement();

     String q="INSERT INTO PACIENTE VALUES("+idPaciente+",\"" +nombre+"\",\"" +apPaterno+"\",\"" +apMaterno+"\",\"" +fechaNacimiento+"\","+edad+",\"" +sexo+"\","+telefono+",\"" +calle+"\",\"" +colonia+"\",\"" +ciudad+"\",\"" +municipio+"\","+cp+","+noRegSoc+"); ";

    
 

     try{

         s.executeUpdate(q);

         System.out.println("Registro Insertado Correctamente");

     }catch(SQLException e) {

         System.out.println(e);

         return
false;

     };

     conexion.close();

     }

     //Excepcion del insert

catch (Exception e)

     {

     e.printStackTrace();

     return
false;

     }

     return
true;

        }

    }

    // Se crea el método de la Baja

    public
boolean BajaPaciente(int idPaciente){

    // Se intenta hacer la baja en la base de datos    

try

{


 

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

Connection conexion = DriverManager.getConnection (


"jdbc:mysql://localhost/consultorio","root", "root");

Statement s = conexion.createStatement();

String q="DELETE FROM paciente WHERE idPaciente="+idPaciente+";";


 


try{

    s.executeUpdate(q);

    System.out.println("Registro Borrado Correctamente");

}catch(SQLException e) {

    System.out.println(e);

    return
false;

};


 

conexion.close();

}


// Excepción de la baja


catch (Exception e)

{

e.printStackTrace();


return
false;

}


return
true;

    }

    

    // Se crea el método de la consulta

public
boolean ConsultaPaciente(int idPaciente){

    // Se
intenta hacer la consulta a la BD
    


try

{


 

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

Connection conexion = DriverManager.getConnection (


"jdbc:mysql://localhost/consultorio","root", "root");

Statement s = conexion.createStatement();

ResultSet rs = s.executeQuery ("select * from paciente where idPaciente="+idPaciente+";");


 


while (rs.next())

{

System.out.println (rs.getInt (1)+rs.getString(2)+rs.getString(3)+rs.getString(4));

}


// Se
cierra
la
conexión
con
la base de
datos.

conexion.close();

}


catch (Exception e)

{

e.printStackTrace();


return
false;

}


return
true;

    }

    

public
boolean ActualizaPaciente(int idPaciente, String nombre, String apPaterno,String apMaterno,String fechaNacimiento,

            int edad,String sexo, int telefono, String calle, String colonia, String municipio,

            String ciudad,int cp,int noRegSoc){

        if(nombre.length()==0 || nombre==null){

            return
false;

        }else
if(apPaterno.length()==0 || apPaterno==null) {

            return
false;

        }else
if(fechaNacimiento.length()==0 || fechaNacimiento==null) {

            return
false;

        }else
if(sexo.length()==0 || sexo==null) {

            return
false;

        }else{

            try

     {

    
 

     DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

     Connection conexion = DriverManager.getConnection (

     "jdbc:mysql://localhost/consultorio","root", "root");

     Statement s = conexion.createStatement();

     String q="UPDATE PACIENTE SET nombre=\"" +nombre+"\",apPaterno=\"" +apPaterno+"\",apMaterno=\"" +apMaterno+"\",fechaNacimiento=\"" +fechaNacimiento+"\",edad="+edad+",sexo=\"" +sexo+"\",telefono="+telefono+",calle=\"" +calle+"\",colonia=\"" +colonia+"\",ciudad=\"" +ciudad+"\",municipio=\"" +municipio+"\",cp="+cp+",NoRegSocial="+noRegSoc+" where idPaciente="+idPaciente+";";

    

     try{

         s.executeUpdate(q);

         System.out.println("Registro Actualizado Correctamente");

     }catch(SQLException e) {

         System.out.println(e);

         return
false;

     };

     // Se
cierra
la
conexión
con
la base de
datos.

     conexion.close();

     }

     catch (Exception e)

     {

     e.printStackTrace();

     return
false;

     }

     return
true;

        }

    }

}


 


 

Clase de Pruebas JUNIT:


 

import junit.framework.*;

public
class Test extends TestCase {

    public Test(){    

    }

    public
void testPaciente(){

//Aqui probamos con la instrucción AssertTrue los métodos de las clases. Los métodos nos regresan un valor binario, true si es correcto, false en caso contrario.

paciente paciente =new paciente();

        assertTrue(paciente.AltaPaciente(2, "Pedro", "Gonzalez", "Garcia", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.ConsultaPaciente(2));

        assertTrue(paciente.ActualizaPaciente(2, "Pedro", "Villarreal", "Garcia", "1940-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.BajaPaciente(2));

    }

    public
void testPacienteValoresNulos(){

        //Como no podemos insertar valores nulos utilizamos el AssertFalse para que nos marque correcto cuando no haga las instrucciones

paciente paciente =new paciente();

        assertFalse(paciente.AltaPaciente(3, "", "", "Garcia", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertFalse(paciente.ActualizaPaciente(3, "", "", "Garcia", "1940-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

    }

    public
void testPacienteValoresNulosPermitidos(){

        paciente paciente =new paciente();

        assertTrue(paciente.AltaPaciente(4, "Pedro", "Gonzalez", "", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.ActualizaPaciente(4, "Pedro", "Villarreal", "", "1940-1-01", 30, "H", 83847563, "", "De las calles", "Callejero", "Callejero", 34567, 8945688));

    }

    public
void testMedicina(){

        medicina medicina =new medicina();

        assertTrue(medicina.AltaMedicina(2,"NAPROXENO","PHARMA","NAPROXENO","NAPROXENO","2012-9-01"));

        assertTrue(medicina.ConsultaMedicina(2));

        assertTrue(medicina.ActualizaMedicina(2,"NAPROXENO","PHARMA","NAPROXENO","NAPROXENO","2013-9-01"));

        assertTrue(medicina.BajaMedicina(2));

    }

    public
void testMedicinaValoresNulos(){

        medicina medicina =new medicina();

        assertFalse(medicina.AltaMedicina(3,"","","","NAPROXENO","2012-9-01"));

        assertFalse(medicina.ActualizaMedicina(3,"","","NAPROXENO","NAPROXENO","2013-9-01"));

    }

    public
void testMedicinaValoresNulosPermitidos(){

        medicina medicina =new medicina();

        assertTrue(medicina.AltaMedicina(4,"NAPROXENO","PHARMA","NAPROXENO","","2012-9-01"));

        assertTrue(medicina.ActualizaMedicina(4,"NAPROXENO","PHARMA","NAPROXENO","","2013-9-01"));

    }

    public
static
void main(String args[]){

        junit.textui.TestRunner.run(Test.class);

    }

}


 

Pantalla de Pruebas


Los enlaces de las páginas en que me basé para hacer este trabajo son:

http://www.gsi.dit.upm.es/~legf/doc/lprg/Transparencias%20LPRG/Pruebas%20Unitarias.pdf

http://www.gsi.dit.upm.es/~anieto/doc/lprg/LPRG%20Documentacion%20y%20Pruebas%20Unitarias.pdf

domingo, 12 de diciembre de 2010

Actividad de la Décima Semana

Eventos, Excepciones y Errores

Los eventos son mecanismos que permiten que una parte del programa
avisa a otra parte sobre un cambio (tipo callback). Se utilizan
típicamente para cosas gráficas, como reaccionar a botones.

Las excepciones son situaciones que causan la no posibilidad de
continuar como planeado (por ejemplo, se iba a abrir un archivo, pero
ese no existe), que deben causar alguna consulta con el usuario u otro
mecanismo para resolver el problema.

Los errores por lo general son no-recuperables y lo único que queda es
cerrar el programa con algo de dignidad.

Para la demostración de dichos conceptos utilicé una ventana del programa del proyecto propuesto. Hice una presentación sobre esto:

Las ligas de las páginas en las que me basé fueron:
http://www.programacion.com/articulo/manejo_de_errores_usando_excepciones_java_98/2
http://www.elcodigo.net/tutoriales/javascript/javascript5.html

sábado, 11 de diciembre de 2010

Actividad de la Novena Semana

Patrones de Diseño

Los patrones de diseño 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.

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

Los patrones de diseño no son fáciles de entender, pero una vez entendido su funcionamiento, los diseños serán mucho más flexibles, modulares y reutilizables. Han revolucionado el diseño orientado a objetos y todo buen arquitecto de software debería conocerlos.

A continuación se enlistan los patrones mas comunes.

Patrones de creación

* Abstract Factory. Proporciona una interfaz para crear familias de objetos o que dependen entre sí, sin especificar sus clases concretas.
* Builder. 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.
* Factory Method. Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan qué clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos.
* Prototype. Especifica los tipos de objetos a crear por medio de una instancia prototípica, y crear nuevos objetos copiando este prototipo.
* Singleton. Garantiza que una clase sólo tenga una instancia, y proporciona un punto de acceso global a ella.


Ejemplos de un Patrón de Creación
Escogí Factory Method por que me pareció interesante para implementar en mi proyecto. A continuación viene una presentación de este patrón con un par de ejemplos de este. Uno es de mi proyecto.

Patrones estructurales

* Adapter. Convierte la interfaz de una clase en otra distinta que es la que esperan los clientes. Permiten que cooperen clases que de otra manera no podrían por tener interfaces incompatibles.
* Bridge. Desvincula una abstracción de su implementación, de manera que ambas puedan variar de forma independiente.
* Composite. Combina objetos en estructuras de árbol para representar jerarquías de parte-todo. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.
* Decorator. Añade dinámicamente nuevas responsabilidades a un objeto, proporcionando una alternativa flexible a la herencia para extender la funcionalidad.
* Facade. Proporciona una interfaz unificada para un conjunto de interfaces de un subsistema. Define una interfaz de alto nivel que hace que el subsistema se más fácil de usar.
* Flyweight. Usa el compartimiento para permitir un gran número de objetos de grano fino de forma eficiente.
* Proxy. Proporciona un sustituto o representante de otro objeto para controlar el acceso a éste.

Ejemplos de un Patrón de Estrucutura
Igual que el ejemplo anterior escogí facade por que vi que era el mas fácil de implementar en el proyecto que propuse. En la presentación viene un ejemplo del proyecto y otro que encontré de facade.

Patrones de comportamiento

* Chain of Responsibility. Evita acoplar el emisor de una petición a su receptor, al dar a más de un objeto la posibilidad de responder a la petición. Crea una cadena con los objetos receptores y pasa la petición a través de la cadena hasta que esta sea tratada por algún objeto.
* Command. Encapsula una petición en un objeto, permitiendo así parametrizar a los clientes con distintas peticiones, encolar o llevar un registro de las peticiones y poder deshacer la operaciones.
* Interpreter. Dado un lenguaje, define una representación de su gramática junto con un intérprete que usa dicha representación para interpretar las sentencias del lenguaje.
* Iterator. Proporciona un modo de acceder secuencialmente a los elementos de un objeto agregado sin exponer su representación interna.
* Mediator. Define un objeto que encapsula cómo interactúan un conjunto de objetos. Promueve un bajo acoplamiento al evitar que los objetos se refieran unos a otros explícitamente, y permite variar la interacción entre ellos de forma independiente.
* Memento. Representa y externaliza el estado interno de un objeto sin violar la encapsulación, de forma que éste puede volver a dicho estado más tarde.
* 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.
* State. Permite que un objeto modifique su comportamiento cada vez que cambia su estado interno. Parecerá que cambia la clase del objeto.
* Strategy. Define una familia de algoritmos, encapsula uno de ellos y los hace intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo usan.
* Template Method. Define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura.
* Visitor. Representa una operación sobre los elementos de una estructura de objetos. Permite definir una nueva operación sin cambiar las clases de los elementos sobre los que opera.

Ejemplo de Patrón de Comportamiento
Por último muestro el ejemplo del patrón Command, basado en el proyecto y en otro que me encontré cuando investigaba sobre este.

Las ligas de donde extraje la información son:
http://www.ingenierosoftware.com/analisisydiseno/patrones-diseno.php
http://download.microsoft.com/download/d/1/a/...adb7.../patrones.ppt
http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o

Actividad de la Octava Semana

Presentación de Diagramas UML

En la siguiente presentación se muestran los diagramas de clases, de casos de usos y de actividades para el proyecto propuesto.