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