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.

lunes, 6 de diciembre de 2010

Actividad de la Séptima Semana

Diagrama de Actividad UML

Los enlaces de las páginas en que se basé para hacer la presentación fueron:
http://www.scribd.com/doc/2568098/UML-Diagramas-de-actividad
http://www.agilemodeling.com/style/activityDiagram.htm

La herramienta con la que hice el diagrama fue:
http://www.descargarsoft.com/descargar-argouml-para-crear-diagramas-uml/

Diagrama de Actividad

En este diagrama podemos apreciar las distintas actividades que se llevan a cabo en el sistema.

Empieza con una llamada del paciente, luego la secretaria, o la persona que atiende la llamada, verifica si el paciente tiene o no cita. En caso de que el paciente tenga cita entonces lo que quiere es una modificación de la cita y se procede a modificar el calendario de las citas. Cuando el paciente no tiene cita se procede a solicitar una cita.

Antes se verifica si el paciente esta dado de alta en el sistema, para esto se va a consultar el catalogo de pacientes y si se encuentra se procede a asignarle la cita, si no se encuentra dado de alta, se le piden los datos para darlo de alta en el sistema.

Para asginar la cita, se consulta en el calendario cuales son las fechas disponibles y se le propone una al paciente, en caso de aceptar, se modifica el calendario poniendole la cita al paciente, en caso de no aceptar se vuelve a consultar el calendario hasta encontrar una fecha en la que el paciente acepte.

Una vez que es el dia de la cita, entonces el paciente llega con el médico, y el médico genera la consulta en base a la cita previamente establecida, se procede a capturar los datos específicos de la consulta y se elabora el diagnostico.

Si el paciente requiere algún medicamento, se procede a consultar la existencia del medicamento deseado en el almacén y si este existe se le asigna el medicamento borrandolo del almacén, en el caso de que no exista, se avisa al paciente y se solicita al proveedor dicho medicamento.

Para asignar el medicamento se crea la receta médica y se imprime y entrega al paciente.

Por último se pasa la consulta al historial clínico del paciente.

viernes, 3 de diciembre de 2010

Actividad de la sexta semana

DIAGRAMAS UML

Los tutoriales en los que me basé fueron: http://www.dcc.uchile.cl/~psalinas/uml/introduccion.html
http://en.wikipedia.org/wiki/Unified_Modeling_Language

La herramienta que utilicé para la elaboración del diagrama fue:
http://staruml.sourceforge.net/en/download.php

Creé un diagrama de clases para los usuarios ya que habrá personas que hagan actividades diferentes en el sistema, y se requieren crear roles, para dichas actividades


Aqui esta el diagrama de clases para el sistema en general

lunes, 8 de noviembre de 2010

Actividad de la Cuarta Semana

Documentación y Herramientas de Desarrollo

La herramienta que he elegido es JAVADOC

Descripción:
Javadoc es una herramienta para la generación de documentación de API'S (Interfaz de programación de aplicaciones) en formato HTML a partir de código fuente JAVA.

Descarga de la herramienta:
Javadoc puede ser descargado solamente como parte del paquete Java JDK o SDK. La liga de descarga es la siguiente:
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u22-oth-JPR@CDS-CDS_Developer

Tutoriales de la herramienta:
http://www.mcs.csueastbay.edu/~billard/se/cs3340/ex7/javadoctutorial.html
http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Para ejemplificar la utilización de Javadoc tomaremos como base el programa de la semana pasada, el programa de Bicycle, aquí esta el código de dicho programa:


Donde podemos observar que:
  • los comentarios van en el formato /** Comentario */
  • utilizamos varios como @author (que especifica el autor de la clase), @param (que especifica los parametros del método),  @version (muestra la version de la clase),  @since (donde ponemos la version de java que utilizamos), @see(es un link a alguna variable/parametro/metodo de la clase), @deprecated(nos muestra que un metodo fue reemplazado).
Para ejecutar javadoc, lo podemos hacer desde nuestra consola cmd desde windows posicionandonos en la carpeta del JDK instalado en el directorio /bin, ahi ejecutamos esta sentencia:
javadoc -author -version Bicycle.java
El -author y -version es para que nos traiga el author y la version que no se generan por defecto.

Al hacer esto inmediatamente despues nos genera un  Html en la carpeta raiz de Java, con la documentación:


Y aqui vemos como se transladan los comentarios y los tags de la clase hacia el HTML generado:

Los tags author, version y since se pasaron así
Los comentarios y el tag deprecated
Los tags see y deprecated ademas de los comentarios

sábado, 6 de noviembre de 2010

Actividad de la Tercera Semana

Herencia y poliformismo
Primero comenzaremos por definir algunos conceptos que se utilizan en la herencia y poliformismo:

Subclass (subclase): Es una clase derivada de otra clase. También se puede llamar, clase derivada, clase extendida o clase hijo.

Superclass (superclase). Es la clase sobre la cual se derivan otras clases, es decir, la clase de la cual esta derivada la subclase. También se puede llamar clase padre o clase base.

HERENCIA

El concepto de herencia en la programacion orientada a objetos consiste en utilizar las atributos y metodos de las clases en la realización de nuevas clases. Es decir que si vamos a definir alguna clase y ya existe alguna clase que incluye código que vamos a utilizar en la nueva, podemos heredarlo.

Una subclase hereda todos los componentes (objetos, atributos, métodos) de la superclase.

A continuación presentaremos un ejemplo de Herencia, en código Java:


public class Bicycle {
 
    // La bibicleta contiene atributos 
public int cadence;
    public int gear;
    public int speed;
 
    // La clase bicicleta contiene un constructor 
public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }
 
    // La clase contiene 4 métodos
    public void setCadence(int newValue) {
        cadence = newValue;
    }
 
    public void setGear(int newValue) {
        gear = newValue;
    }
 
    public void applyBrake(int decrement) {
        speed -= decrement;
    }
 
    public void speedUp(int increment) {
        speed += increment;
    }
 
}
Para declarar la clase bicicleta de montaña como subclase de bicicleta se usa el siguiente código:

public class MountainBike extends Bicycle {
 
    // la clase de bicicleta de montaña adiere un atributo
    public int seatHeight;

    // la clase tiene un constructor
    public MountainBike(int startHeight, int startCadence, int startSpeed,  
        int startGear) {
        super(startCadence, startSpeed, startGear);
        seatHeight = startHeight;
    } 
 
    // la clase tiene un método
    public void setHeight(int newValue) {
        seatHeight = newValue;
    } 

}
 Con esto la clase Bicicleta de Montaña hereda los atributos y métodos de la clase padre Bicicleta, exepto por los constructores que esos no se pueden heredar pues son unicos de clase clase.

Una subclase hereda todos los miembros de tipo protected y public de la clase padre,  sin embargo no hereda los miembros private.

Aplicación en la actividad de la semana dos (tienda en linea tipo amazon):
Superclase: Producto
Subclase: Pedido


Superclase: Cliente
Subclase: Pedido

Superclase: Pedido
Subclases: Envío, Estatus


POLIFORMISMO
 
El diccionario define el término poliformismo como un principio de biología en el cual, cada organismo o especie puede adquirir diferentes formas o estados. Si queremos llevar este término a la programación orientada a objetos tenemos por poliformismo, que la subclase de una clase puede definir su propio comportamiento y compartir funcionalidades de la clase padre.

Para ejemplificar el poliformismo tomaremos el ejemplo antes mencionado solo que lo modificaremos un poco. Agregaremos un método de impresión a la clase padre, bicicleta.


public void printDescription(){
 System.out.println("\nBike is in gear " + this.gear + " with a cadence of " +
        this.cadence + " and travelling at a speed of " + this.speed + ". ");
}
Despues agragaremos otra subclase Bicicleta de carrera. A la clase bicicleta de 
montaña le agregaremos otro método en el cual extraeremos la suspención de esta 
bicicleta. Asi es como quedo la clase bicicleta de montaña:
public class MountainBike extends Bicycle{
  private String suspension;

  public MountainBike(int startCadence, int startSpeed, int startGear, String 
    suspensionType){
    super(startCadence, startSpeed, startGear);
    this.setSuspension(suspensionType);
  }

  public String getSuspension(){
    return this.suspension;
  }

  public void setSuspension(String suspensionType){
    this.suspension = suspensionType;
  }

  public void printDescription(){
    super.printDescription();
    System.out.println("The MountainBike has a " + getSuspension()
            + " suspension.");
  }
} 
Notamos como se sobreescribe el método de la impresion de la clase padre bicicleta, 
adiriendo la descripción de la suspencion de la clase de la bicicleta de montaña.
Ahora definimos la otra clase de la siguiente manera:
public class RoadBike extends Bicycle{
  private int tireWidth; // In millimeters (mm)

  public RoadBike(int startCadence, int startSpeed, int startGear, int 
    newTireWidth){
    super(startCadence, startSpeed, startGear);
    this.setTireWidth(newTireWidth);
  }

  public int getTireWidth(){
    return this.tireWidth;
  }

  public void setTireWidth(int newTireWidth){
    this.tireWidth = newTireWidth;
  }

  public void printDescription(){
    super.printDescription();
    System.out.println("The RoadBike has " + getTireWidth()
            + " MM tires.");
  }

}
 
Igual que en la clase anterior vemos como se sobreescribe sobre el método de 
impresión de la clase padre. Esta es una prueba sobre las clases que tenemos:
public class TestBikes {
  public static void main(String[] args){
    Bicycle bike01, bike02, bike03;

    bike01 = new Bicycle(20, 10, 1);
    bike02 = new MountainBike(20, 10, 5, "Dual");
    bike03 = new RoadBike(40, 20, 8, 23);

    bike01.printDescription();
    bike02.printDescription();
    bike03.printDescription();

  }
}
Y la salida que obtenemos es la siguiente:
Bike is in gear 1 with a cadence of 20 and travelling at a speed of 10. 

Bike is in gear 5 with a cadence of 20 and travelling at a speed of 10. 
The MountainBike has a Dual suspension.

Bike is in gear 8 with a cadence of 40 and travelling at a speed of 20. 
The RoadBike has 23 MM tires.
Aplicación en la actividad de la segunda semana(tienda en línea tipo Amazon)
En el método, mostrar estatus de la clase estatus de pedido
puede obtenerse diferentes impresiones
Estatus(en almacen)
Estatus(en envio)
Estatus(recibido)
Estatus(rechazado)
Podemos utilizar el poliformismo en la impresion de estos estatus.
Fuente:
http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html
Escogí esta fuente por que me pareció simple la explicación y muy buen ejemplo, aparte de que como estamos viendo java pensé que lo mejor sería ir a la página principal del lenguaje.