jueves, 29 de septiembre de 2011

Tarjetas CRC

  • Son una metodología para el diseño de programas orientados a objetos.
  • CRC son las iniciales de clase, responsabilidad y colaboración.
  • Resumen las responsabilidades de una clase antes de pasar a realizar el diagrama.
  • Sirven para simular escenarios.

Las tarjetas CRC representan objetos; la clase a la que pertenece el objeto se puede escribir arriba, las responsabilidades u objetivos que debe llevar a cabo el objeto se pueden escribir a la izquierda, y la derecha las clases que se relacionan con dicho objeto.



Tarjetas CRC de mi Proyecto





Documentación técnica en mi proyecto

Ya se vio la importancia de la documentación. Procederé a considerarla en mi proyecto para lo cual utilizaré el código generado a partir del diagrama de clases que hice.


Primero comentarizo mis clases.




Clase Interfaz


/**
* Clase que crea la interfaz del editor y 
  recibe las acciones de las clases con las 
  que se relaciona para sus menús.
*
* @author Jair Viezca Esparza.
*
* Fecha de creación: 17 de Septiembre del 2011.
*
* Última actualización: 26 de Septiembre del 2011.
*/

import java.util.*;


/**
 * Clase Interfaz
 */
public class Interfaz {

  //
  // Fields
  //

  
  /**
  * Constructor de la clase interfaz
  */
  public Interfaz () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

}


Clase accionesArchivo

/**
* Clase que define algunas de las acciones básicas del menú archivo
*
* @author Jair Viezca Esparza.
*
* Fecha de creación: 17 de Septiembre del 2011.
*
* Última actualización: 26 de Septiembre del 2011.
*/

import java.util.*;


/**
 * Clase accionesArchivo
 */
public class accionesArchivo {

  //
  // Fields
  //

  
  /**
  // Constructor de la clase 
  */
  public accionesArchivo () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  /**
   * Método que realiza todo el proceso funcional de el menú archivo. El parámetro
     event se utiliza para manejar las acciones de los menuitems
   * @param event
   */
  public void actionPerformed( ActionEvent event )
  {
  }


}


Clase accionesEdicion

/**
* Clase que define algunas de las acciones básicas del menú edición
*
* @author Jair Viezca Esparza.
*
* Fecha de creación: 17 de Septiembre del 2011.
*
* Última actualización: 26 de Septiembre del 2011.
*/

import java.util.*;


/**
 * Clase accionesEdicion
 */
public class accionesEdicion {

  //
  // Fields
  //

  
  /**
  // Constructor de la clase
  */
  public accionesEdicion () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  /**
   * Método que realiza todo el proceso funcional de el menú edición. El parámetro
     event se utiliza para manejar las acciones de los menuitems
   * @param event
   */
  public void actionPerformed( ActionEvent event )
  {
  }


}


Clase accionesFormato

/**
* Clase que define algunas de las acciones básicas del menú formato
*
* @author Jair Viezca Esparza.
*
* Fecha de creación: 17 de Septiembre del 2011.
*
* Última actualización: 26 de Septiembre del 2011.
*/

import java.util.*;


/**
 * Clase accionesFormato
 */
public class accionesFormato {

  //
  // Fields
  //

  
  //
  // Constructor de la clase
  //
  public accionesFormato () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  /**
   * Método que realiza todo el proceso funcional de el menú formato. El parámetro
     event se utiliza para manejar las acciones de los menuitems
   * @param event
   */
  public void actionPerformed( ActionEvent event )
  {
  }


}




Después me ubico en la carpeta en donde tengo mis archivos de código.

Mi carpeta inicial

Posteriormente entro al cmd y me dirijo hacia esa carpeta. Una vez ahí escribo el siguiente comando:

javadoc *.java

lo cual tomará todos esos comentarios escritos entre /** y */ de los documentos con extensión java, y creará los archivos con formato HTML ya sea en la misma carpeta o en otra donde se requiera.

Ejecución del javadoc


Mi carpeta después de javadoc


De todos esos archivos HTML el más importante es el index, así que lo abrí con Mozilla Firefox  y listo.

Documentación de mi proyecto


Esto es muy bueno ya que le da más formalidad al trabajo.

Importancia de la documentación técnica

¿Qué es la documentación técnica? Documentar es agregar cierta información al código que nos permitirá conocer detalles importantes de éste y con lo cual se espera  tener mayor facilidad a la hora de leer las instrucciones de la aplicación ya sea por parte del creador o por otra persona.

La documentación no es un lujo(*) sino una necesidad por lo tanto, es sumamente importante de considerar a la hora de hacer un software, ya que es común que los programas sufran cambios a lo largo de su “vida” al adaptarse a nuevos escenarios, por lo tanto poner líneas  con esta información ayudará a repararlo y modificarlo.
(*) Con lujo me refiero a que sea algo de más, algo de adorno.

Ejemplo de aplicación de documentación técnica  tomado de  http://es.wikipedia.org/wiki/Javadoc



¿Y qué es lo que comúnmente se documenta? Comenzar documentando el propósito del software, el desarrollador y la fecha de creación no sería una mala idea. Tampoco lo sería comentar la funcionalidad de cada uno de los métodos o clases. Todo comentario es bien recibido siempre y cuando aporte.  

La documentación bien podría hacerse sólo en el código y ya, sin embargo esto no sería del todo adecuado teniendo herramientas que permiten manejar toda la documentación en un sitio aparte de una forma clara y ordenada.

Hay decenas de generadores de documentación (Sandcastle, NDdoc, Doxygen, Natural Docs), cada uno con sus requerimientos y especificaciones, sin embargo me centraré en javadoc ya que es el que voy a utilizar para mi proyecto.



Javadoc

Es un recurso de Oracle que nos permite generar la documentación en formato HTML de una aplicación en Java.

Dentro de un código, Javadoc toma aquellos comentarios que cuentan con las marcas especiales especificadas por dicho programa y construye un archivo HTML en el que se maneja toda esa información como toda la documentación estándar de Java provista por SUN.

He aquí el API de Java  provista por Oracle. Éste es un claro ejemplo de cómo se generaría su documentación.



¿Y cuáles son esas marcas especiales?

Javadoc toma en consideración aquellos comentarios que empiecen con /**  y terminen con  */, por lo tanto todo lo que escribamos dentro de esos signos será material de trabajo para Javadoc. A la vez, dentro de estos comentarios podremos utilizar instrucciones HTML y ciertas palabras reservadas generalmente precedidas del “@”, y que son muy útiles para la documentación de datos relevantes.

A continuación se presentarán algunas de las palabras reservadas comúnmente utilizadas:



Una vez expuestos los identificadores se podrá ser capaz de entender el ejemplo mostrado en la parte superior de esta entrada.


¿Cómo se consigue Javadoc?

Javadoc viene incluido en el JDK.

He aquí la liga para descargar el Java Development Kit en caso de no contar con éste.

También se puede descargar de forma aislada en este link:



¿Cómo se ejecuta Javadoc?

Javadoc se ejecuta simplemente haciendo uso de estas líneas en el cmd:

javadoc [paquete] archivo.java, ...

Al  momento de hacer lo anterior se crearán todos los files HTML así que hay que cerciorarse de generarlos en una carpeta aparte para que no se mezclen con los files del código.



FUENTES

Generación de código a partir del diagrama de clases

Continuando con lo de la entrada anterior, Umbrello cuenta con otras particularidades muy interesantes y es que se puede generar el código fuente a partir del diagrama que se tenga construido. Cuenta con una amplia gama de lenguajes de programación con la que puede producir el código, algunos de los cuales son:

  • Java.
  • C++.
  • PHP.
  • Javascript.
  • Python.
  • Perl, etc.

A continuación dejo algunos tutoriales o apoyos que encontré en la red para la generación de código en Umbrello.

Presentaré la generación de código en java obtenida de mi diagrama de la entrada anterior. Cabe recordar que son 4 clases.


Clase Interfaz

import java.util.*;


/**
 * Class Interfaz
 */
public class Interfaz {

  //
  // Fields
  //

  
  
  public Interfaz () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

}


Clase accionesArchivo

import java.util.*;


/**
 * Class accionesArchivo
 */
public class accionesArchivo {

  //
  // Fields
  //

  
  
  public accionesArchivo () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  
  public void actionPerformed( ActionEvent event )
  {
  }


}


Clase accionesEdicion

import java.util.*;


/**
 * Class accionesEdicion
 */
public class accionesEdicion {

  //
  // Fields
  //

  
 
  public accionesEdicion () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  
  public void actionPerformed( ActionEvent event )
  {
  }


}


Clase accionesFormato

import java.util.*;


/**
 * Class accionesFormato
 */
public class accionesFormato {

  //
  // Fields
  //

  
  //
  // Constructor de la clase
  //
  public accionesFormato () { };
  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  //
  // Other methods
  //

  
  public void actionPerformed( ActionEvent event )
  {
  }


}


Observando y analizando bien mi código generado y comparándolo con el código que ya tenía hecho, puedo decir que se parecen mucho aunque aún no me explico bien lo de la clase importada. De ahí en fuera puedo estar seguro que apoyarse generando el código también puede ser una buena opción para iniciar la implementación de un proyecto que se necesite hacer.

Diagrama de clases para mi proyecto




Mi diagrama de clases está constituido por cuatro clases, lo cual modela principalmente la parte funcional de mi proyecto. La clase interfaz es la que va a contener los menú items que recibirán objetos de las clases accionesArchivo, accionesEdicion y una nueva clase que pienso hacer que se llama accionesFormato, para darle la funcionalidad esperada a las opciones del menú.


El diagrama lo hice en Ubuntu utilizando una herramienta CASE llamada Umbrello, la cual ayuda a hacer diagramas UML para facilitar el desarrollo de software. Umbrello es libre así que cualquiera que lo necesite lo puede descargar gratis sin ningún problema.
Umbrello no sólo es capaz de modelar diagramas de clases sino también: 
  • Diagramas de casos de uso.
  • Diagramas de componentes.
  • Diagramas de modelo entidad-relación.
  • Diagramas de secuencias.
  • Diagramas de estado, etc.


A continuación se muestra una imagen de la interfaz de Umbrello.



He aquí algunos links para descargar Umbrello. Cabe mencionar que dicho programa sólo está disponible  para la plataforma Linux.


A veces pueden suceder algunos problemas en Umbrello,  algunos de los cuales experimenté y es por esa razón que mi diagrama de clases no se ve muy detallado que digamos. Sin embargo pienso que cumple.


En las tres clases de la parte inferior de mi diagrama coincide el mismo método debido a que es el que implemente de ActionListener para mis menu items y es el que tendrá la funcionalidad en cada uno de ellos.


IMÁGENES
1
2


INFORMACIÓN
1

miércoles, 28 de septiembre de 2011

Codificación de herencia y polimorfismo en mi proyecto

Como ya lo mencioné en la anterior entrada, la parte funcional o lógica de mi proyecto no aplica la herencia ni el polimorfismo, sin embargo en lo que respecta a la parte que tiene que ver con los JComponents aplico la herencia cuando quiero crear la JFrame y hago uso de “super” para hacer referencia al constructor de la superclase (JFrame). El polimorfismo está presente por ejemplo cuando creo el JTextArea ya que a constructor le puedo pasar parámetros de distintas maneras.

Lo siguiente representa una parte de mi código correspondiente a la interfaz. La intención es mostrar la herencia aplicada en la creación de la ventana.

import javax.swing.*;
import java.awt.*;


// Clase Interfaz que hereda de JFrame

public class Interfaz extends JFrame{

 JMenuBar barraMenu;
 JMenu archivo;
 JMenuItem abrirFichero;
 JMenuItem guardarFichero;
 JMenu edicion;
 JMenuItem cortar;
 JMenuItem copiar;
 JMenuItem pegar;
 JTextArea areaDeTrabajo;
 JScrollPane desplazamiento;  
 

 public Interfaz(){

 super("Editor ++"); // Se hace referencia al constructor de la superclase con "super"
 this.setSize(400,400);
 this.definir_componentes();
 this.agregar_componentes();
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.setVisible(true);

 }

 public void definir_componentes(){
 
 areaDeTrabajo = new JTextArea();
 areaDeTrabajo.setLineWrap(true);
 areaDeTrabajo.setWrapStyleWord(true);
 desplazamiento = new JScrollPane(areaDeTrabajo);

 barraMenu = new JMenuBar();
 archivo = new JMenu("Archivo");
 edicion = new JMenu("Edición");
 
 abrirFichero = new JMenuItem(abr);
 guardarFichero = new JMenuItem();
 
 
 copiar = new JMenuItem();
 pegar = new JMenuItem();
 cortar = new JMenuItem();
 
 
 }

 public void agregar_componentes(){

 barraMenu.add(archivo);
 barraMenu.add(edicion);
 archivo.add(abrirFichero);
 archivo.add(guardarFichero);
 edicion.add(copiar);
 edicion.add(pegar);
 edicion.add(cortar);
 this.add(barraMenu, BorderLayout.NORTH);
 this.add(desplazamiento, BorderLayout.CENTER);

 } 

} 



Ejemplo del polimorfismo paramétrico de la clase JTextArea que utilizo tomado de http://download.oracle.com/javase/6/docs/api/


Descripción textual que identifica y explica las relaciones de herencia y el polimorfismo para mi proyecto

Antes que nada definiré lo que es herencia y polimorfismo. Después de lo anterior describiré las relaciones de herencia y polimorfismo presente en mi proyecto (si es que hay).

La herencia es una de las características más importantes y útiles de los lenguajes orientados a objetos. Consiste en definir una clase tomando como base una ya existente. Esto a la vez da origen a otra propiedad de los OO: la reutilización de código.

En Java, para poder llevar a cabo la herencia  se tendrá que hacer uso de la palabra reservada extends después del nombre de la clase “hija”. Justo después de extends se escribirá el nombre de la clase de la cual se quiere heredar (padre).

Al heredar de una clase, heredaremos tanto sus atributos y métodos, siempre y cuando no sean privados; y en la clase “hija” aparte de utilizar esos atributos o métodos heredados, también se es posible agregar nuevas campos y funciones para cumplir con la situación nueva.

A la clase de la cual se hereda se le puede llamar de varias formas: clase padre (como ya se apreció arriba), superclase o clase base.
A la clase heredada se le llama comúnmente clase hija,  subclase o clase derivada.

A continuación se presenta un sencillo ejemplo de herencia en java:



/*************************************************
* Clase cuya principal función es definir las
  características habituales de una persona 
*
*
*
**************************************************/

// Clase creada con la finalidad de ser superclase
public class Persona{

 // Atributos protegidos que al ser heredados podrán ser manejados por la subclase
 protected String nombre;
 protected int edad;
 
 // Contructor de la clase Persona
 public Persona(String nombre, int edad){
  this.nombre = nombre;
  this.edad = edad;
 
 }
 
 //Método que devuelve el nombre
 public String getNombre(){
 
  return nombre;
 
 }
 
 //Método que devuelve la edad
 public int getEdad(){
 
  return edad;
 
 }
 
 //Método que permite modificar la edad
 public void cambiarEdad(int edad){
 
  this.edad = edad;
 
 }

}
 


/*************************************************
* Clase que permite definir estudiantes 
*
*
*
**************************************************/

/* Clase llamada Estudiante que hereda de la clase Persona y por lo tanto
tiene la capacidad de manejar los atributos y métodos de la superclase*/
public class Estudiante extends Persona{

 //Aparte de tener un nombre y edad, el estudiante cuenta con una matrícula
 private int matricula;
 
 //Constructor de la clase Estudiante
 public Estudiante(int matricula){
     
  /*Con la llamada de super aplicamos la reutilización de código lo cual hace que
  no tengamos que escribir más*/
  super("Juan", 19); //Hace referencia al constructor de la superclase
  this.matricula = matricula;
 
 }
 
 //Devuelve la matrícula
 public int getMatricula(){
 
  return matricula;
 
 }

}


/*************************************************
* Clase que permite crear estudiantes 
*
*
*
**************************************************/

public class Main{

 public static void main(String[] args){
 
  //Se crea un objeto de la clase Estudiante con el nombre de est1
  Estudiante est1 = new Estudiante(1464573);
  
  /*Imprime los datos del estudiante además de que comprueba que la herencia
  fue un éxito*/
  System.out.printf("\n El nombre del estudiante est1 es %s cuya edad es %d anios \n ", est1.getNombre(),est1.getEdad());
  System.out.printf("y tiene por matricula %d\n\n", est1.getMatricula());
 
 }

}





El polimorfismo es otra de las características distintivas de los Lenguajes Orientados a Objetos. Significa muchas formas y una de sus aplicaciones se encuentra en los métodos o constructores.

Hay varios tipos de polimorfismo. Tratar todos ellos sería muy largo, por eso me basare solamente en el polimorfismo paramétrico.

El polimorfismo paramétrico es cuando dos o más métodos o constructores tienen el mismo nombre pero reciben parámetros distintos. Por ejemplo:





public class Pez{

 private int velocidad;
 private  int profundidad; 

 public Pez(){
        
        }


        public void nadar(int velocidad){
        
        } 

        public class nadar(int velocidad, int profundidad){
  
        }

}



El ejemplo de arriba es un poco vago sin embargo es bueno para mostrar el polimorfismo paramétrico.



Mi proyecto


Mi proyecto, como ya está mencionado en las primera entradas de este blog, es un editor de texto. Si lo divido podría pensar en una parte lógica y en una parte gráfica.

La parte lógica es la parte funcional de mi aplicación, mientras que la gráfica es la parte con lo que interactuará el usuario.

Lo ideal es que la herencia y el polimorfismo se apliquen a mi parte lógica sin embargo en mi proyecto no pasa así.

Mi proyecto lo ideé para que cada menú tuviera su clase, por ejemplo, crearé la clase menu_archivo y ahí entrarán las funcionalidades de mis menú ítems, y así sucesivamente. Ya verifique cada una de las clases y no se aplicará la herencia ni el polimorfismo en la parte funcional, y eso no significa que este mal, sin embargo la intención es aplicarlo para entenderlo.


FUENTES

miércoles, 14 de septiembre de 2011

Retroalimentación con mi compañero Horacio sobre nuestros proyectos

De lo primero que hablamos fue de lo que trataba nuestro proyecto así como también los detalles y funcionalidades de éste.

Él me contó que iba a programar un juego al estilo de "Bouncing Ball", que en lo personal a mi me gusta mucho. Pienso que es un buen reto para él el realizar ese programa y que lo hará hasta mejor que lo que podemos apreciar en sitios web de juegos y consolas.

Al final compartimos unos cuantos tips y sugerencias que sin duda ayudarán en la realización del proyecto de cada quien

jueves, 8 de septiembre de 2011

Diagrama de clases en Umbrello


El objetivo principal de realizar este diagrama fue el de interactuar con la interfaz de Umbrello para explorarlo e ir conociendo la ubicación de los recursos que ofrece.




domingo, 4 de septiembre de 2011

Interfaces en Java


Son expresiones de diseño, las cuales se implementan no se extienden. Contienen métodos sin definir llamados abstractos que posteriormente podemos implementar (la acción de esos métodos va por nuestra parte) de diferentes maneras según lo requerido. Cabe mencionar que una interfaz te “dice” que hacer más no cómo.

Una clase puede implementar varias interfaces.


Para declarar una interfaz se haría lo siguiente:



public interface funcionesdelaCalculadora{
	public abstract void sumar(int a[]);
	public abstract void restar(int b[]);
	public abstract void multiplicar(int c[]);
	// …
}


Para implementarla en una clase:


public class Calculadora implements funciones de la calculadora{
	public abstract void sumar(int a[]){
	// Implementación del método
	}
	public abstract void restar(int b[]){
	//Implementación del método
	}
	public abstract void multiplicar(int c[]){
	//Implementación del método
	}
}


Fuentes
1
2
3

sábado, 3 de septiembre de 2011

Ejercicio 3 "Caso Biblioteca"

La universidad X tiene un sistema de información que le maneja el catálogo de bibliotecas y los préstamos.

El usuario ingresa con un nombre (matrícula, # de nómina) y contraseña (nip asignado por la biblioteca)

Puede buscar dentro del catálogo aquellos libros que le interesan; se le despliegan los datos bibliográficos (incluida imagen). - Considerar que el libro no siempre está disponible: prestado, en reparación, en encuadernación, apartado, etc.

También se puede sacar los libros prestados.
  • Siempre y cuando el usuario no tenga muchas multas.
  • Si los libros son de consulta, no se pueden sacar.
  • El tiempo de préstamo es diferente si se trata de un alumno de licenciatura, maestría, doctorado o un maestro.

Casos de uso






Clases (con atributos y métodos)



Relaciones de herencia


   Usuario
o   Alumno
·         Licenciatura
·         Maestría
·         Doctorado
o   Empleado
·         Maestro
    Libro           
o   Libros de Ciencias Exactas
o   Libros de Ciencias Sociales
o   Libros de Ciencias Naturales

 Préstamo
o   Préstamo a licenciatura
o   Préstamo a maestría
o   Préstamo a doctorado
o   Préstamo a maestro



Ejercicio 2 "Algunos conceptos a considerar"


UML

Lenguaje Unificado de Modelado (LUM) o Unified Modeling Language (UML) es, como su nombre lo indica, un lenguaje de modelado de software que al contar con varios tipos de diagramas puede definir completamente un sistema informático orientado a objetos.

UML se encarga de especificar las funciones y procesos de un objeto, no los programa.

Algunos programas gratuitos en la red que nos pueden ayudar a modelar en UML son:
Dia, gModeler, StarUML, TCM, Umbrello.




OMG

El Object Management Group (OMG) es una organización no lucrativa que establece estándares de tecnologías orientadas a objetos, como es el caso de UML. Promueve el uso de la tecnología OO. El grupo está formado por distintas organizaciones, algunas de las cuales son:

  • Hewlett – Packard
  • Eclipse Foundation
  • Microsoft Corporation
  • Sparx System



OOSE

Object – Oriented Software Engineering (OOSE) es una técnica de diseño de software usada principalmente para  hacer programas utilizando la POO.

OOSE fue desarrollado en 1992 y es la primera metodología que usó casos en el diseño de software. OOSE es una de las precursoras del UML.




OOSAD

Object - Oriented  Systems Analysis & Design permite modelar un sistema como un conjunto de objetos interactivos. Cada objeto representa en sí una entidad de interés a ser modelada en el sistema, la cual es caracterizada por su clase, sus atributos y su comportamiento.



OOP

Object – Oriented Programming (OOP) es un paradigma de la programación que se caracteriza por desarrollar programas usando objetos (como su nombre lo indica).

La OOP cuenta con algunas ventajas sobre otros paradigmas de programación: uniformidad, flexibilidad, reusabilidad, estabilidad, etc.



Fuentes