viernes, 20 de mayo de 2011

lunes, 16 de mayo de 2011

domingo, 15 de mayo de 2011

~Semana 13. Implementación de Interfaces Gráficas

Semana 13
Materia: Taller de Programación Orientada a Objetos
Hora: Jueves M1-M2



Hola a todos, en esta entrada les mostraré parte de código de mi interfaz gráfica. Para realizar mi interfaz gráfica utilicé una herramienta muy útil que te genera el código automáticamente. Netbeans:)




En este programa creé un JFrame que es el que se ve en la imagen de arriba, como pueden ver arriba se encuentran dos apartados, Source y Design en el apartado de Design se encuentran las paletas donde están los diferentes tipos de elementos para la interfaz (botones, panel, tablas, etc). Solo es cuestión de seleccionar el elemento que queramos poner y ponerlo en el JFrame. También se pueden modificar los elementos por ejemplo el tipo de letra, el color, etc. 




En esta ventana edite el Texto de Bienvenido a Nutrilife para hacerlo más grande y con letras negritas. Para hacer esto solo tienes que seleccionar el objeto que quieres modificar y hay un apartado del lado derecho que dice Properties. En ese apartado se encuentran diferentes propiedades de este objeto para que los puedas modificar. 

También puedes agregar Labels con imagenes como la imagen que yo puse del logo de mi programa. Para agregar la imagen al label tienes que crear un label y en sus propiedades hay una que dice icon, ahí puedes seleccionar la imagen que deseas poner en el Lable.






Ahora veamos partes del código. Primero les pondré la parte de código del Logo, de la frase Bienvenido a Nutrilife y de el primer botón.





setTitle("Nutrilife");

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/nutrilife/gui/logo_1201.png"))); // NOI18N

        jLabel2.setFont(new java.awt.Font("DejaVu Sans", 1, 48)); // NOI18N
        jLabel2.setText("Bienvenido a Nutrilife! ");

        jButton1.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton1.setText("NUEVO PACIENTE");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }

Como pueden ver en esta partesita del código la parte de setTitle sirve para ponerle el nombresito que va mero arriba en la ventana y le puse que apareciera Nutrilife, luego viene el JLabel1 que tiene el ícono o la imagen de mi programa, como pueden ver se pone con setIcon y se pone en getResourse la ubicación de la imagen, luego viene el JLabel2 que es el Label donde puse Bienvenido a Nutrilife! primero se pone la letra con setFont y vienen las propiedades de la letra (tipo de letra, tamaño) y también tiene otro método que es setText que es al que se le tiene que poner que quieres que diga el Label en este caso es "Bienvenido a Nutrilife!". Luego viene el botón que es el JButton1 el que viene siendo Nuevo Paciente el cual tiene un actionListener y dentro de este un actionPerformed que es para que le pongas lo que quieres que haga el botón. En mi caso yo le puse que ese botón quiero que abra una nueva ventana.



private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    PacienteGUI form = new PacienteGUI();
    form.setVisible(true);
}              


Este botón habla a la ventana PacienteGUI que también esta declarada como JFrame. Se las muestro a continuación.


Vamos a correr estos JFrames.



Cuando le picamos al botón Crear Paciente nos aparece la siguente ventana.


Le agregué una línea al código del primer botón para que al momento de que abra la otra ventana se cierre la ventana anterior.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    PacienteGUI form = new PacienteGUI();
    form.setVisible(true);
    this.dispose();
} 
  


Ahora mostraré el código de la interfaz gráfica del primer JFrame

private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        jButton7 = new javax.swing.JButton();
        jButton8 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Nutrilife");

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/nutrilife/gui/logo_1201.png"))); // NOI18N

        jLabel2.setFont(new java.awt.Font("DejaVu Sans", 1, 48)); // NOI18N
        jLabel2.setText("Bienvenido a Nutrilife! ");

        jButton1.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton1.setText("NUEVO PACIENTE");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton2.setText("MODIFICAR PACIENTE");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton3.setText("BORRAR PACIENTE");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jButton4.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton4.setText("VER PACIENTES");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jButton5.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton5.setText("NUEVA DIETA");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jButton6.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton6.setText("MODIFICAR DIETA");
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });

        jButton7.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton7.setText("BORRAR DIETA");
        jButton7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton7ActionPerformed(evt);
            }
        });

        jButton8.setFont(new java.awt.Font("DejaVu Sans Light", 1, 18));
        jButton8.setText("VER DIETAS");
        jButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton8ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel2))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(92, 92, 92)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jButton2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
                            .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
                            .addComponent(jButton4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
                            .addComponent(jButton1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(171, 171, 171)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jButton8, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE)
                            .addComponent(jButton7, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE)
                            .addComponent(jButton6, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE)
                            .addComponent(jButton5, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE))
                        .addGap(61, 61, 61)))
                .addGap(47, 47, 47))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(34, 34, 34)
                        .addComponent(jLabel1)
                        .addGap(63, 63, 63))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap(129, Short.MAX_VALUE)
                        .addComponent(jLabel2)
                        .addGap(32, 32, 32)))
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton6, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton7, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton8, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(131, 131, 131))
        );

        pack();
    }// 

Bueno tengo un problema con mi interfaz, ya logré conectarla a la base de datos pero no he podido conectar cada JTextField con mi base de datos para que al escribir en los JTextFields se guarden los datos en la base de datos. Si me guarda los datos al correr el programa pero en "terminal" 


Elegimos la opcion 2..


Escribimos los datos que nos piden, no importa si algunos datos no los llenamos y ahora veamos que ya se muestra en la base de datos :).

Cloud Storage

Puntos extra :)
Materia: Taller de Programación Orientada a Objetos

Hola a todos compañeros, bueno en esta entrada les hablaré de algunas páginas que nos dan un espacio para guardar nuestros archivos Online. Esto es demasiado útil cuando pasan tragedias con nuestras computadoras, que se descomponen y se pierde algo importante que teníamos, o cuando se nos pierde el USB, para esto podemos hacer un respaldo al que puedas acceder por medio de internet.

Estuve buscando entre cuales eran las mejores gratuitas, y les recomiendo las siguientes. Yo normalmente uso Dropbox pero estuve buscando haber si había algunas con más capacidad de almacenamiento.

SugarSync.
Es un servicio similar a dropbox que te brinda una capacidad de almacenaje de 5GB, también es muy útil cuando quieres consultar un documento y estás fuera de tu casa, lo puedes consultar desde tu IPad, IPhone o IPod touch, Dispositivo Android, Blackberry, Windows Mobiles y Symbian.

Les dejo el link para que se registren. Registrarse.

 
Al momento que te registras y confirmas tu cuenta te va a pedir que descargues un archivo, esto es para tener sugarsync en tu computadora lo cual no es necesario yo no lo descargué. 



Aquí estan las cossas que puedes realizar, yo me fui directamente a share a folder y esto te va a llevar a lo siguiente.


Como pueden ver puedes compartir archivos, crear carpetas y lo más importante puedes subir tus archivos y tienes 5GB de almacenamiento. Así cuando tengas un proyecto importante o algo que no quieras perder puedes subirlo aquí y accesar a él de mil formas. 

DropBox
Dropbox es la herramienta ideal si trabajas con documentos en varios ordenadores a la vez.

Compatible con Windows, Mac y Linux, y accesible directamente desde el Explorador de archivos y desde el navegador web, Dropbox te ofrece hasta 2GB gratuitos de espacio en Internet para que subas toda clase de ficheros, ya sean canciones, fotografías, vídeos o documentos de texto.

Con Dropbox te será muy fácil compartir archivos en varios equipos, ya que cuando añadas uno nuevo, éste se sincronizará automáticamente con tu cuenta de Dropbox.
  • 2GB de espacio gratuito
  • Muy fácil de usar
  • Accesible desde cualquier SO y por web
  • Sincroniza las carpetas que escojas
  • Historial de archivos subidos y bajados
  • Sincronización instantánea y automática
El link de dropBox ---> DropBox






Bueno este es muy parecido al otro, tiene menos capacidad de almacenaje pero es muy  bueno también.

Al igual que en el pasado creas tu cuenta y accedes a la página donde puedes subir tus archivos.


 
Bueno esto es todo compañeros, espero que les sea útil :). Saludos!

jueves, 12 de mayo de 2011

~Semana 13. Diseño de Interfaces Gráficas


Semana 13
Materia: Programación Orientada a Objetos
Hora: Martes M1-M3

Hola a todos, en esta entrada les mostráre dibujos que realicé de mas o menos como quiero que quede mi programa con la interfaz gráfica. 

Primero que nada hablemos de las interfaces gráficas. La interfaz gráfica también conocida como GUI (Graphical User Interface) es la forma en que el programa se comunica más facilmente con el usuario, donde los comandos de nuestro programa se muestran por medio de objetos gráficos (botones, ventanas,etc.) e imagenes.

Los dispositivos de interfaz humana se diseñan para conectar alguna parte del cuerpo del ser humano con la interfaz gráfica de forma que puedan ser introducidos al sistema. La mayoría son dispositivos que permiten introducir directamente información de "acción" al ordenador que tiene una iterfaz gráfica.
Por ejemplo el mouse es un dispositivo de interfaz humana, puede representar en la interfaz gráfica cosas como "apuntar", "pulsar", "arrastrar", "mover", etc. Los dispositivos más importantes son el teclado, el mouse, el trackball (bola), el cursor táctil (touchpad), la tableta gráfica y el Joystick. 

Estos dispositivos se utilizan para introducir un tipo de información específica al sistema a través de interfaz gráfica. 

Las ventanas son utilizadas de forma interactiva para la visualización, navegación de la información en un interfaz gráfico de usuario. A través de ellas podemos ver documentos, aplicaciones, íconos en los cuales se pueden realizar diferentes acciones.

Las siguientes imagenes son los dibujos que realicé de como me gustaría que quedara mi sistema ya con interfaz gráfica.

Primero que nada la pantalla de bienvenida donde se muestra el logo, el nombre de mi programa y un mensaje de bienvenida que dice "Bienvenido a Nutrilife!". También están los botones de Paciente, Dieta y Salir. El botón de Paciente te lleva a otra pantalla donde te aparecen los datos del paciente que ahorita les mostraré. El botón de Dieta lleva a otra ventana donde se muestra la tabla de energía que también ahorita mostraré y explicaré. Por último el botón salir como su nombre lo dice es para salir del sistema.


Primero vemos la ventana de paciente en la siguiente imagen, mi idea es que esta ventana tenga pestañas arriba donde se vaya cambiando para ir a las diferentes clases de paciente, como antecedentes familiares, enfermedades, entre otras cosas. Bueno en esta ventana se llenan los datos personales del paciente: nombre, edad, fecha de nacimiento, etc.. No todos los campos son obligatorios si no tiene por ejemplo teléfono foráneo o dirección foranea no es necesario que lo ponga. Los campos donde se llenarán estos datos son cuadros de texto, en algunos casos y por ejemplo en estado civil puse circulitos donde seleccionará el estado civil en el que se encuentra. Esta ventana tiene dos botones el de Guardar datos y Salir. Guardar datos se utilizará para guardar los datos que ya se hayan ingresado, estos datos van para la base de datos. El botón salir es para salir del sistema.



Ahora veamos las ventanas de Dieta. En esta ventana se muestra una tabla que es la tabla que sirve para hacer la dieta. En la energía se pone las kcal que el paciente debe comer por día, luego dependiendo de los resultados de los estudios se pondrá el porcentaje de carbohidratos, proteínas y lípidos que debe consumir el paciente. En esta ventana se encuentran dos botones uno que es continuar que es para seguir con la dieta y salir para salir del sistema.



Ahora veamos que pasará si le damos continuar en esta ventana. Se mostrará la pestaña de lácteos donde aparecen los alimentos lácteos permitidos en la dieta. Al lado de cada lácteo puse un cuadrito donde tendrá que poner el número de intercambios que podrá consumir de ese alimento. Esto es para que se realicen los cálculos correspondientes dependiendo de cada alimento. Abajo de esto se encuentra una sugerencia con un * y están los botones de continuar y salir.


Bueno esto es todo lo de esta entrada, espero que quede así como lo planie estaría perfecto, no se que tan dificil este pero primero quiero hacerlo sencillo y que funcione y ya después estaré modificandolo para mejorarlo. Comenten para puntos extras ya saben :D saludos!

jueves, 5 de mayo de 2011

~Semana 11. Implementación de Pruebas Unitarias

Semana 11
Materia: Taller de Programación Orientada a Objetos
Hora: Jueves M1-M2

Hola a todos, en esta entrada les mostraré la implementación de pruebas unitarias en mi proyecto.

La clase con la que trabajaremos es Carbohidratos.java la cual la muestro a continuación.

ppublic class Carbohidrato {
    
    double lecheDescremada; 
    double lecheSemidescremada;
    double lecheEntera;
    double lecheConAzucar;
    double fruta;
    double verdura;
    double azucarSinGrasa;
    double azucarConGrasa;
    double leguminosa;
    double cerealSinGrasa;
    double cerealConGrasa;
    double alimentoMuyMagro;
    double alimentoMagro;
    double alimentoSemigraso;
    double alimentoGraso;
    double aceiteSinProteina;
    double aceiteConProteina;
    double subtotal1;
    double subtotal2;
    double subtotal3;
    double subtotal4;
    int intercambioLecheDescremada = 1;
    int intercambioLecheSemidescremada = 0;
    int intercambioLecheEntera = 0;
    int intercambioLecheConAzucar = 0;
    int intercambioFruta = 3;
    int intercambioVerdura = 3;
    int intercambioAzucarSinGrasa = 2;
    int intercambioAzucarConGrasa = 1;
    int intercambioLeguminosa = 3;
    int intercambioCerealConGrasa = 1;
    int intercambioCerealSinGrasa = 2;
    int intercambioAlimentoMuyMagro = 3;
    int intercambioAlimentoMagro = 1;
    int intercambioAlimentoSemigraso = 0;
    int intercambioAlimentoGraso = 0;
    int intercambioAceiteSinProteina = 1;
    int intercambioAceiteConProteina = 0;

    //Metodos set

    public void setLecheDescremada() {
        lecheDescremada = (intercambioLecheDescremada * 12);
    }
    public void setLecheSemidescremada() {
        lecheSemidescremada = (intercambioLecheSemidescremada * 12);
    }
    public void setLecheEntera() {
        lecheEntera = (intercambioLecheEntera * 12);
    }
    public void setLecheConAzucar() {
        lecheConAzucar = (intercambioLecheConAzucar * 30);
    }
    public void setFruta() {
        fruta = (intercambioFruta * 15);
    }
    public void setVerdura() {
        verdura = (intercambioVerdura * 4);
    }
    public void setAzucarSinGrasa() {
        azucarSinGrasa = (intercambioAzucarSinGrasa * 10);
    }
    public void setAzucarConGrasa() {
        azucarConGrasa = (intercambioAzucarConGrasa * 10);
    }
    public void setLeguminosa() {
        leguminosa = (intercambioLeguminosa * 20);
    }
    public void setCerealSinGrasa() {
        cerealSinGrasa = (intercambioCerealSinGrasa * 15);
    }
    public void setCerealConGrasa() {
        cerealConGrasa = (intercambioCerealConGrasa * 15);
    }
    public void setAlimentoMuyMagro() {
        alimentoMuyMagro = (intercambioAlimentoMuyMagro * 0);
    }
    public void setAlimentoMagro() {
        alimentoMagro = (intercambioAlimentoMagro * 0);
    }
    public void setAlimentoSemigraso() {
        alimentoSemigraso = (intercambioAlimentoSemigraso * 0);
    }
    public void setAlimentoGraso() {
        alimentoGraso = (intercambioAlimentoGraso * 0);
    }
    public void setAceiteSinProteina() {
        aceiteSinProteina = (intercambioAceiteSinProteina * 0);
    }
    public void setAceiteConProteina() {
        aceiteConProteina = (intercambioAceiteConProteina * 3);
    }
    public double setSubtotal1() {
        subtotal1 = ( lecheDescremada + lecheSemidescremada + lecheEntera + lecheConAzucar + fruta + verdura + azucarSinGrasa + azucarConGrasa + leguminosa );
 return subtotal1;
    }
    public double setSubtotal2() {
        subtotal2 = ( cerealSinGrasa + cerealConGrasa);
 return subtotal2;    
 }
    public double setSubtotal3() {
        subtotal3 = ( alimentoMuyMagro + alimentoMagro + alimentoSemigraso + alimentoGraso);
 return subtotal3;
    }
    public double setSubtotal4() {
        subtotal4 = ( aceiteSinProteina + aceiteConProteina);
 return subtotal4;
    }
   public void setClaseCarbohidrato()
    {
        setLecheDescremada();
        setLecheSemidescremada();
        setLecheEntera();
        setLecheConAzucar();
        setFruta();
        setVerdura();
        setAzucarSinGrasa();
        setAzucarConGrasa();
        setLeguminosa();
        setCerealSinGrasa();
        setCerealConGrasa();
        setAlimentoMuyMagro();
        setAlimentoMagro();
        setAlimentoSemigraso();
        setAlimentoGraso();
        setAceiteSinProteina();
        setAceiteConProteina();
 double subtotal1 = setSubtotal1();
 double subtotal2 = setSubtotal2();
 double subtotal3 = setSubtotal3();
        double subtotal4 = setSubtotal4();
    }
}

Bueno, en esta clase como pueden ver hago algunas operaciones, estas operaciones son operaciones necesarias para el calculo de las dietas, calculan cuanta energia tiene cada alimento. Al final estos calculos ayudan para saber si la dieta esta balanceada o no. Bueno en esta clase utilicé los metodos subtotal para la prueba. 

Diseño de prueba.

La prueba unitaria la diseñé de la siguiente manera.

1.- Primero lo que hacemos es importar las librerias JUnit, estas librerias son necesarias para hacer las pruebas ya que contienen los métodos necesarios para realizar nuestras pruebas.

package proyecto;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

2.- Realizamos nuestra clase en mi caso yo la llame Prueba, esto quiere decir que mi archivo se llama Prueba.java. Esta clase extiende TestCase que por decir vendria siendo el papá. Tenemos que declarar una variable que sea el mismo nombre del nombre de la clase de la que estamos realizando la prueba, en mi caso mi clase es Carbohidrato por esto declare Carbohidrato C. Después tenemos un método setUp el en el cual vamos a inicializar un objeto de la clase Carbohidrato.

public class Prueba extends TestCase {

 protected Carbohidrato c;
 
 protected void setUp() {
 this.c = new Carbohidrato(); 
 return;
 }
 
 public static Test suite() {  
 return new TestSuite(Prueba.class);  
 }  




3.- Ahora programamos nuestras pruebas, en mi caso yo voy a comparar double como pueden ver puse que mi double expected en el test1() es 159.0. Esto se debe a que como yo puse los valores predeterminados de los numeros de intercambio se realizaron las operaciones y sume el resultado de subtotal1. Como pueden ver en la imagen de arriba el subtotal1 viene de la formula#1 si sumamos los valores que tengo ahí sería 12.0 + 0.0 + 0.0 + 0.0 + 45.0 + 12.0 + 20.0 + 10.0 + 60.0 = 159.0. En los otros test realicé lo mismo pero con subtotal2 y subtotal3.

public void test1() {

     double expected = 159.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal1();
     assertEquals(expected,actual); 
     return;

 }
     public void test2() {
     
     double expected = 40.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal2();
     assertEquals(expected, actual);
     return;

 }
 public void test3() {
     
     double expected = 0.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal3();
     assertEquals(expected,actual);
     return;
        }


Ahora veamos el resultado de estas pruebas.






En esta prueba que realice me dice que hay un error en el test2() ya que yo puse de double expected un 40.0 pero si nos regresamos a la imagen de arriba donde tenemos los resultados de las operaciones en la Formula#2 en subtotal2 tenemos 30.0 + 15.0 y esto es igual a 45.0 no a 40.0 como yo habia puesto. Vamos a ver ya corregido esto como salen nuestras pruebas.

public void test2() {
     
     double expected = 40.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal2();
     assertEquals(expected, actual);
     return;

 } 


Ahora si, las 3 pruebas se realizaron con éxito y sin ningun error :). Batallé un poco en que los resultados fueran exitosos primero me salia un error que solucioné gracias a la explicación de mi compañero José en su blog ya que yo ya había puesto en el CLASSPATH todo lo que debe configurarse pero me mandaba un error a la hora de ejecutar mi prueba. Hice los pasos que vienen en el blog de José para configurar JUnit y se solucionó dicho error. También otro error que tuve era al momento de poner los métodos de las pruebas test1, test2 y test3 ponía como double expected el resultado que debía ser pero después cuando lo corría me decia que no coincidian porque el resultado que obtenía de setSubtotal1() era 0.0 luego me di cuenta que era porque tenía que correr todos los métodos que tengo en este caso setClaseCarbohidrato() donde se realizan todos los métodos de operaciones y así ya setSubtotal1() tendría el valor real de la suma, por esto en los métodos agregue setClaseCarbohidrato para que se ejecutaran las operaciones y así obtener el subtotal correcto.

Bueno esto es todo, saludos a todos :)

~Semana11. Diseño de Pruebas Unitarias

Semana 11
Materia: Programación Orientada a Objetos
Hora: Martes M1-M3

Hola a todos en esta entrada les hablaré sobre pruebas unitarias de un sistema.




JUnit. Se preguntarán ¿Qué son pruebas unitarias? ¿Para que se utilizan? etc. Les explicaré. 

Las pruebas unitarias son pruebas como su nombre lo dice que se utilizan para verificar el funcionamiento de una parte de código. Esto quiere decir que se hacen pruebas para asegurarnos de que nuestro código funcione correctamente por separado. JUnit son un conjunto de librerías que se utilizan en Java para realizar estas pruebas unitarias.

Ventajas de pruebas unitarias
  • Las pruebas unitarias son la mejor forma para encontrar errores en nuestro código, no encuentra todos los errores que puedan haber pero si algunos.
  • El sistema llega a la fase de integración con un alto grado de seguridad de que el código funcione correctamente.
  • Las pruebas también sirven como documentación de tu código ya que muestran como utilizar tu código. 
  • El programador puede cambiar su código para darle una mejor estructura.
  • La única interacción entre los casos de prueba y las unidades que se prueban son las interfaces de dichas unidades que se estan probando, se puede cambiar cualquiera de los dos sin afectar al otro.
Como lo dije anteriormente, es importante recordar que estas pruebas no garantizan detectar TODOS los errores que tiene nuestro código.
 
JUnit

Es un conjunto de librerías como ya lo mencioné que se utilizan en java para realizar pruebas unitarias. Fueron creadas por Erich Gamma y Kent Beck. JUnit son clases (frameworks) que nos permiten realizar ejecuciones de clases Java para validar el funcionamiento de nuestros métodos los cuales queremos probar. Se basa en función de un valor de entrada y un valor esperado si la clase cumple con esto las pruebas pasarán exitosamente, en el caso contario que el valor esperado no sea el valor que regresó el método JUnit devuelve un mensaje de error.


JUnit ejecuta los siguientes pasos.
  1. Crear una subclase de junit.framework.TestCase.
  2. Opcionalmente sobre-escribir el método setUp() en el cual se inicializan los objetos y variables usados por los casos de prueba. 
  3. Opcionalmente sobre-escribir el método tearDown() en el cual se invocarrá al final de cada caso de prueba y sirve para liberar recursos utilizados en la prueba.
  4. Crear métodos de prueba a la clase en el cual pondrás los métodos que quieres poner a prueba de tu clase que estás probando.

Para realizar las pruebas unitarias en Java se necesita descargar las librerías JUnit de la página http://www.junit.org/ en los blogs de mis compañeros Juan Carlos y José encontrarán como configurarlas. 


Esto es todo :) saludos a todos!

jueves, 7 de abril de 2011

~Semana 10. Eventos, excepciones y errores

Semana 10
Materia: Taller de Programación Orientada a Objetos
Jueves M1-M2

Hola a todos, en esta entrada les explicare un poco sobre el uso de excepciones, errores y eventos dentro de mi proyecto. 

Excepciones
Algunas de las excepciones que he agregado a mi proyecto están en la parte de validación de datos por parte del usuario.
package nutrilife.gui;
import nutrilife.dieta.*;
import java.util.InputMismatchException;
/**
 *
 * @author Carmen Suarez
 */
public class Main {

    public static void main(String[] args) {
        
        //Variable that stores that will stream the input from console
        Dieta D = new Dieta();
        boolean control = true;
        do
        {
            try
            {
                InputDieta.input(D);
                control = false;
            }
            catch (InputMismatchException inputMismatchException)
            {
                inputMismatchException.printStackTrace();
                System.out.println("Vuelve a meter los datos");
            }
        }while( control );
    }
}
package nutrilife.gui;
import nutrilife.dieta.*;
import java.util.*;
/**
 *
 * @author Carmen Suarez
 */
public class InputDieta {
    static void input(Dieta D) throws InputMismatchException
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Dame el numero de energia");
        D.setEnergia(scan.nextDouble());
        System.out.println("Energia: " + D.getEnergia());
        boolean c = true;  //Variable de control
        //Entrar porcentajes
        do
        {
            try
            {
                System.out.print("Dame el porcenaje de carbohidratos: ");
                D.setPorcentajeCarbohidrato(scan.nextDouble());
                System.out.println("Porcentaje de carbohidratos: " + D.getPorcentajeCarbohidrato());

                System.out.print("Dame el porcenaje de proteinas: ");
                D.setPorcentajeProteina(scan.nextDouble());
                System.out.println("Porcentaje de proteinas: " + D.getPorcentajeProteina());

                System.out.print("Dame el porcenaje de lipidos: ");
                D.setPorcentajeLipido(scan.nextDouble());
                System.out.println("Porcentaje de lipidos: " + D.getPorcentajeLipido());

                D.setPorcentajeTotal(); // Calcula el valor para la variable porcentajeTotal

                if( D.getPorcentajeTotal() != 100)
                {
                    throw new MyException();
                }
                c = false;
                D.setCarbohidratos(); // Calcula el valor para la variable carbohidrato
                D.setProteina(); // Calcula el valor para la variable proteina
                D.setLipido(); // Calcula el valor para la variable lipido
            }
            catch(MyException myException)
            {
                myException.getMessage();
                myException.printStackTrace();
            } 
        }while(c); // Termina entrada de porcentajes
        
        //Entrada de Intercambios
        //intercambios de grupo: Leche
        System.out.print("Dame el intercambio de leche descremada: ");
        D.setIntercambioLecheDescremada(scan.nextInt());
        System.out.println("Intercambios para leche descremada: " + D.getIntercambioLecheDescremada());
        System.out.print("Dame el intercambio de leche semidescremada: ");
        D.setIntercambioLecheDescremada(scan.nextInt());
        System.out.println("Intercambios para leche semidescremada: " + D.getIntercambioLecheSemidescremada());
        System.out.print("Dame el intercambio de leche entera: ");
        D.setIntercambioLecheEntera(scan.nextInt());
        System.out.println("Intercambios para leche entera: " + D.getIntercambioLecheEntera());
        System.out.print("Dame el intercambio de leche con azucar: ");
        D.setIntercambioLecheConAzucar(scan.nextInt());
        System.out.println("Intercambios para leche con azucar: " + D.getIntercambioLecheConAzucar());

        //Intercambios de grupo: Fruta
        System.out.print("Dame el intercambio de la fruta: ");
        D.setIntercambioFruta(scan.nextInt());
        System.out.println("Intercambios para la frutar: " + D.getIntercambioFruta());

        //Intercambios de grupo: Verdura
        System.out.print("Dame el intercambio de la verdura: ");
        D.setIntercambioVerdura(scan.nextInt());
        System.out.println("Intercambios para la verdura: " + D.getIntercambioVerdura());

        //Intercambios de grupo: Azucar
        System.out.print("Dame el intercambio de la azucar sin grasa: ");
        D.setIntercambioAzucarSinGrasa(scan.nextInt());
        System.out.println("Intercambios para la azucar sin grasa: " + D.getIntercambioAzucarSinGrasa());
        System.out.print("Dame el intercambio la azucar con grasa: ");
        D.setIntercambioAzucarConGrasa(scan.nextInt());
        System.out.println("Intercambios para la azucar con grasa: " + D.getIntercambioAzucarConGrasa());

        //Intercambios de grupo: Leguminosas y Cereales
        System.out.print("Dame el intercambio la leguminosa: ");
        D.setIntercambioLecheConAzucar(scan.nextInt());
        System.out.println("Intercambios para la leguminosa: " + D.getIntercambioLecheConAzucar());
        System.out.print("Dame el intercambio del cereal sin grasa: ");
        D.setIntercambioCerealSinGrasa(scan.nextInt());
        System.out.println("Intercambios para del cereal sin grasa: " + D.getIntercambioCerealSinGrasa());
        System.out.print("Dame el intercambio del cereal con grasa: ");
        D.setIntercambioCerealConGrasa(scan.nextInt());
        System.out.println("Intercambios para del cereal con grasa: " + D.getIntercambioCerealConGrasa());

        //Intercambios de grupo: Alimentos de origen animal
        System.out.print("Dame el intercambio la carne muy magra: ");
        D.setIntercambioAlimentoMuyMagro(scan.nextInt());
        System.out.println("Intercambios para la carne muy magra: " + D.getIntercambioAlimentoMuyMagro());
        System.out.print("Dame el intercambio la carne magra: ");
        D.setIntercambioAlimentoMagro(scan.nextInt());
        System.out.println("Intercambios para la carne magra: " + D.getIntercambioAlimentoMagro());
        System.out.print("Dame el intercambio la carne semigrasa: ");
        D.setIntercambioAlimentoSemigraso(scan.nextInt());
        System.out.println("Intercambios para la carne semigrasa: " + D.getIntercambioAlimentoSemigraso());
        System.out.print("Dame el intercambio la carne grasa: ");
        D.setIntercambioAlimentoGraso(scan.nextInt());
        System.out.println("Intercambios para la carne grasa: " + D.getIntercambioAlimentoGraso());

        //Intercambios de grupo: Aceites
        System.out.print("Dame el intercambio de aceite sin proteina: ");
        D.setIntercambioAceiteSinProteina(scan.nextInt());
        System.out.println("Intercambios para de aceite sin proteina: " + D.getIntercambioAceiteSinProteina());
        System.out.print("Dame el intercambio de aceite con proteina: ");
        D.setIntercambioAceiteConProteina(scan.nextInt());
        System.out.println("Intercambios para de aceite con proteina: " + D.getIntercambioAceiteConProteina());
    }
}
La clase IOUser lo que hace es crear una dieta con valores default y mandar a llamar a al método estático input de la clase InputDieta para que pueda inicializar los datos de la dieta. Este llamado está dentro de un bloque try, lo que nos permite atrapar cualquier excepción que se arroje dentro de él. 

El bloque catch solamente imprime el StactTrace de la excepción que es una descripción de donde se origina el error de la excepción y todos los saltos que dio para llegar al try. Estuve leyendo que esta manera de desplegar, aunque es un tanto gorrosa para el usuario sirve mucho para hacer debugs de los programas y saber exactamente donde se origina el error.

Lo que hice fue meter los bloques try y catch dentro de un do-while para que el usuario vuelva a meter todos los datos desde el principio, ya que no se puede asegurar que ciertos datos estén bien y otros no (Como es en el caso de que la excepción se mande en la validación de porcentajeTotal). Este do-while solamente finaliza cuando el método input retorna el control del programa al método que lo llamo y después la variable booleana que controla el do-while es asignado con un valor falso para que salga. Si ocurre una excepción dentro del método input, no se ejecuta la instrucción de control es falso. Si no ocurre una excepción el programa continuara con la instrucción control es falso y saldrá del do-while.

Error

Los errores, como bien mencione en la entrada pasada, son en su mayoría errores tanto del JVM (memoria llena, errores internos, stak overflow, etc.) como de errores en la lectura de los recursos externos del programa como lo son lecturas de archivos, conexiones a bases de datos, etc.
package nutrilife.gui;
import java.sql.*;

/**
 *
 * @author Carmen Suarez
 */
public class CreateSQLConnection {
    static final String DRIVER = "com.mysql.jdbc.Driver";
    static final String DATABASE_URL = "jdbc:mysql://localhost/3306/Dieta";
    static final String USUARIO = "root";
    static final String PASSWORD = "";
    public static void connection()
    {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL, USUARIO, PASSWORD);
            statement = connection.createStatement();
            resultSet = statement.executeQuery("Select * from FichaIdentificacion");
            ResultSetMetaData metaData = resultSet.getMetaData();
            int numberOfColumns = metaData.getColumnCount();

            for ( int i = 1; i <= numberOfColumns; i++ )
            {
                System.out.printf( "%-8s\t", resultSet.getObject(i));
            }
            System.out.println();

            while(resultSet.next())
            {
                for ( int i = 1; i <= numberOfColumns; i++ )
                    System.out.printf( "%-8s\t", resultSet.getObject(i));
                System.out.println();
            }
            
        }
        catch (SQLException sqlException) {
            sqlException.getMessage();
            System.out.println();
            sqlException.printStackTrace();
            throw new Error();
        }        
        catch(ClassNotFoundException classNotFoundException)
        {
            classNotFoundException.getMessage();
            System.out.println();
            classNotFoundException.printStackTrace();
        }
        finally
        {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception exception) {
                exception.getMessage();
                exception.printStackTrace();
            }
        }      
    }
}
Por lo tanto decidí que si el programa no puede establecer una conexión con la base de datos, esta finalice ya que el programa no sirve para nada sino tiene los datos de pacientes o dietas. 
En la parte
connection = DriverManager.getConnection(DATABASE_URL, 
                                         USUARIO, PASSWORD);
Si no obtiene una conexión con la base de datos, esta lanza una excepción que la tengo que agarrar porque se trata de una clase que lanza excepciones "checked" que a fuerzas se tienen que manejar. La excepción es agarrada por un catch que imprime su StackTrace y lanza un error para finalizar el programa.
También use los bloques finally porque de esta manera puedo asegurarme que aunque se lance o no se lance una excepción y/o error, el programa liberara los recursos de la base de datos. 

La clase todavía le falta bastante para obtener todos los datos, pero necesito ver cómo voy a estructurar las tablas del paciente en la base de datos junto con las tablas de las dietas.

Bueno esto es lo que corresponde a eventos, excepciones y errores de mi proyecto. Espero que hayan entendido, cualquier duda o comentario me lo hacen saber ;) saludos!

miércoles, 6 de abril de 2011

~Semana 10. Eventos, excepciones y errores

Semana 10
Materia: Programación Orientada a Objetos
Martes M1-M3

Hola a todos, en esta entrada les hablaré sobre eventos, excepciones y errores.

Bueno primero que nada se preguntarán que son cada uno de ellos, cuando utilizamos cada uno de estos, entre otras cosas.

Eventos
Un evento es una acción que realiza el usuario, estos eventos avisan al programa que ha realizado el usuario para así que el programa pueda manejarlo de alguna manera. Por ejemplo, cuando presionamos una tecla, cuando damos click en un botón se están generando eventos. 

Esto se debe de tomar muy en cuenta cuando estamos realizando nuestro código ya que debemos de pensar que tipos de eventos pueden llegar a ocurrir y manejar estos eventos de alguna manera. Por ejemplo en mi proyecto yo me pongo a pensar mucho en que va a haber botones por ejemplo de guardar o de crear cita y cosas así y yo tengo que avisarle a mi programa que al momento de que el usuario presione el botón de guardar, tiene que realizar los métodos necesarios para guardar todos los datos. 

La forma de manejar estos eventos en programación orientada a objetos se conoce como emisor/receptor donde el emisor se hace cargo de enviar el evento mientras el receptor lo recibirá y lo manejará de la forma que sea mas conveniente.




Algunos tipos de eventos. 
  • ComponentEvent:  Se produce este evento cuando el usuario mueva un componente.
  • FocusEvent:  Se produce este evento cuando se cambia el foco de un componente.
  • KeyEvent:  Se produce este evento cuando el usuario pulsa una tecla.
  • MouseEvent:  Se produce cuando el usuario realiza un movimiento con el mouse o haga un click.
  • ContainerEvent:  se produce cuando se añaden o eliminen componentes en el contenedor.
  • WindowEvent:  se produce cuando se realice algún tipo de operación con la ventana como abrirla y cerrarla.
  • ActionEvent:  Se produce cuando se efectúe alguna acción sobre un componente, por ejemplo, cuando pulsas un botón.


Como lo mencioné en mi proyecto se utilizarán varios eventos para cuando presionen los botones que espero que tenga mi programa como por ejemplo cuando den click a un botón guardar que esto ocasione que los datos se guarden, así pasará con todos los botones que tenga mi programa. También quiero que mi programa tenga diferentes pestañas que por ejemplo cuando elijas ver un paciente de la base de datos y te despliegue sus datos personales que tenga pestañas como historial, dieta del paciente y cosas así entonces yo creo que un evento también sería cuando cambia de pestaña y le despliega algo diferente.


Excepciones
Las excepciones se utilizan para la detección y corrección de errores. Si hay un error el programa no debería tronar y cerrarse, esto se debe evitar por medio de excepciones. Se lanza un throw con una excepcion para después poner un catch que captura el error y lo resuelve. Esto es para que el programa no se cierre y siga en funcionamiento. 

Tipos de excepciones.
  • Error: excepciones que indican problemas muy graves, de los que normalmente no se pueden recuperar.
  • Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecución.
  • RuntimeException: Excepciones que se dan durante la ejecución del programa.

Todas las excepciones tienen como clase base la clase Throwable que es la que maneja todos los errores y excepciones. 

En mi programa se manejan muchas excepciones como las siguientes:

  • Una excepción que podría ser es cuando tenemos un paciente que tiene una enfermedad o por ejemplo que sea intolerante a la lactosa pues obviamente no tolera la leche con lactosa entonces se las podriamos eliminar, o en caso de que seleccione esta puede mandarle un mensaje que esto le puede hacer daño.
  • Otra excepción que quiero poner es por ejemplo en el caso de los intercambios de energía o todos los datos que deseamos ingresar, si el usuario en ves de poner un número pone un string el programa manejará una excepción que haga que muestre un mensaje para que vuelva a ingresar el dato correctamente.
  • También en algunas operaciones como en la dieta el porcentaje total de carbohidratos, proteinas y lípidos debe de dar 100% entonces si no da esto mandar un mensaje que no están bien los porcentajes.

Estas excepciones son las que he pensado pero creo que puede haber más, creo que cuando ya tenga la interfaz gráfica podrán salir más errores ya que al estarlo probando ya podré saber que otros errores pueden presentarse. 


Errores.
Como lo mencioné en un apartado de excepciones los errores son problemas que son imposibles de reparar, o sea que cuando sucede un error grave el programa se cerrará. Esto lo usaré en el peor de los casos que ya no se pueda hacer nada. Por ejemplo en la conexión con la base de datos creo que puede ser útil ya que si por ejemplo no se encuentra la base de datos el programa no puede hacer nada para resolver este problema y tendrá que cerrarse. 

Bueno esto es lo que corresponde a eventos, excepciones y errores de mi proyecto. Espero que hayan entendido, cualquier duda o comentario me lo hacen saber ;) saludos!

~Semana 9. Patrones de Diseño

Semana 9
Materia: Programación Orientada a Objetos
Martes M1-M3

Hola a todos, en esta entrada les hablaré sobre los patrones de diseño.
Abstact Factory 
El propósito de este patron de diseño proporciona un contacto para crear familias de objetos relacionados o dependientes sin tener que especificar su clase concreta.

Por ejemplo. 
Si tienes que administrar información de contactos con sus respectivos teléfonos y direcciones, como se hace en una agenda. Se tendrían que crear clases para administrar direcciones, números de teléfono y nombre de contactos. Estas clases tendrán que almacenar información de los contactos con ciertos formatos. Por ejemplo en Norteamérica todos los números de teléfono están limitados a 10 dígitos y el código postal también tiene cierto formato. 

También puede ser que administrando los contactos, algún contacto tenga números de teléfono de otros países, por ejemplo Holanda, en Holanda tienen diferentes reglas para los números de teléfono o direcciones válidas por lo que se tienen que realizar validaciones. Cada vez que se agreguen más y más contactos esto se irá extendiendo de más y más reglas y se tendrá que estar modificando y recompilando el código. 

Abstact Factory es una solución a este problema ya que con este patrón se define una clase AdressFactory para generar objetos que siguen un patrón general pata Address y PhoneNumber. En tiempo de ejecución esto se asocia con un número de fábricas para distintos países y cada país tiene su propia versión de las clases Address y PhoneNumber.

Este patrón es aplicado cuando:

  • El cliente debe ser independiente del proceso de creación de los productos.
  • La aplicación debe configurarse con una o más familias de productos.
  • Es necesario crear los objetos como un conjunto, de forma que sean compatibles. 
  • Desea proporcionar una colección de clases y únicamente quiere revelar sus contratos y relaciones, no sus implementaciones.
Ventajas y desventajas

Una Abstact Factory ayuda a incrementar la flexibilidad general de una aplicación. Durante el diseño, no se tiene que predecir todos los usos futuros de la aplicación, se crea un framework general y se desarrollan implementaciones independientes del resto de la aplicación. En tiempo de ejecución, la aplicación puede integrar fácilmente nuevas características y recursos.

Otra ventaja es que se puede simplificar la comprobación del resto de la aplicación. Implementando unas clases TestConcreteFactory y TestConcreteProduct puede servir para simular el comportamiento esperado de los recursos.

Si el producto abstracto no está definido apropiadamente, puede resultar difícil o incluso imposible generar productos concretos deseados.



Abstact Factory en mi Proyecto.  
Según lo que entendí y con este ejemplo que puse creo que podría utilizar este patrón de diseño en Dietas, ya que habrá diferentes tipos de dietas con diferentes formatos ya que algunas dietas tendrán ciertas excepciones, pienso que en la cuestión de los alimentos se puede utilizar este tipo de patrón. 


Prototype
Este patrón de diseño facilita la creación dinámica al definir clases las cuales sus objetos pueden crear copias de si mismos.

Aplicado a mi Proyecto.
Cuando se necesite copiar algún objeto con el fin de que el usuario no tenga que introducir manualmente toda la información cuando se crea un nuevo paciente por ejemplo. Una solución a este problema es.
Crear un nuevo objeto Paciente y copiar los valores del objeto Paciente existente.

La desventaja de este patrón es que viola el principio de encapsulación de la orientación a objetos, esto me hace estar un poco indecisa en usar o no usar este patrón. Para poder llegar a esta solución se tienen que hacer llamadas a métodos para copiar la información necesaria. Esto quiere decir que es más difícil mantener el código de la clase Paciente porque se extenderá en todo el proyecto. Además que también dificulta la reutilización de la clase Paciente.



Ventajas
El patrón de diseño Prototype es muy útil porque permite que los sistemas generen una copia de un objeto, con variables ya establecidas a un valor significativo.


Adapter
Este patron de diseño es de tipo estructural, sirve como intermediario entre dos clases, convirtiendo las interfaces de una clase para que pueda ser utilizada por otra.

Una de las ventajas de la programación orientada a objetos citada con mayor frecuencia es que permite la reutilización del código. Como los datos y el comportamiento se centralizan en una clase, puede mover una clase de un proyecto a otro y reutilizar su funcionalidad.

Por ejemplo, si estas realizando un gestor de información personal y un amigo de otro país decide cooperar contigo ya que tu amigo ha estado trabajando en un proyecto similar y puedes proporcionarle una implementación comercial de un sistema. Pero al momento de recibir los ficheros, la interfaz no corresponde con las interfaces que el ha estado utilizando en su aplicación y también puede que el código esté en otro idioma que el no conoce.

Tendrías dos soluciones posibles.

  • La primera opción sería reescribir el componente para que implemente todas las interfaces requeridas. Reescribir el nuevo componente es algo menos recomendable porque tendrías que hacer esto mismo cada vez que recibas la última versión de tu amigo.
  • La segunda opción es reescribir su propia aplicación y empezar a utilizar nuevas interfaces. La desventaja es que tendrías que recorrer todo su código para cambiar todas las ocurrencias de la interfaz antigua.
Lo que se necesita es un traductor -un componente que traduzca las llamadas de una interfaz en llamadas a otra interfaz distinta.
La verdad no se si esto aplique en mi proyecto, aunque si lo voy a comercializar sería bueno pensar en este tipo de patrón de diseño. 

Bueno, esto es todo de patrones de diseño, cualquier comentario ya saben pueden hacerlo :D saludos