Pages

Documentacion Tecnica

La importancia de la documentacion tecnica

Para entender la importancia de la documentacion veamos un ejemplo.

Imaginemos que somos llamados para realizar nuestras practicas profesionales en la empresa Jcode. En dicha empresa necesitan una minima modificacion a el sistema encargado de las bases de datos de los empleados, ya que el encargado esta de vacaciones y las modificaciones son de prioridad maxima, si el practicante puede implementar dichas modificaciones aseguraria su puesto.

El requisito es el siguiente.
* No permitir que los nombres de los empleados en la base de datos contengan numeros; solo seran permitidios los caracteres.

* No permitir que los campos de nombres y apellidos queden vacios.

Inmediatamente te diriges a modificar el codigo fuente del sistema, y localizas la parte que ejecuta las inserciones a la base de datos.


public class insert {

    String p;
    String l;
    String x;

    EscuchaEventos m = new EscuchaEventos("as"1,true);

    p = m.insen();
    l =    m.insea();
    x =    m.insee();

    basedatos bd = new basedatos();

    bd.upd(p,l,x);

}
Al ver esto cualquiera se asustaria. Las variables no tienen mucho sentido,  no hay forma de saber cuales son los elementos importantes, no tiene metodos implementados. No se sabe si esta clase es necesaria, y al parecer solo el encargado principal, aquel que escribio el codigo es capaz de interpretarlo.

Quiza aun exista manera de arreglarlo, pero ahora imaginen que se quedan con el empleo.
Traten de visualizar todo el codigo igual de codificado, seria una pesadilla, no?

Es por ello que la documentacion tecnica es tan importante, a nivel de proyecto es indispensable mantener una documentacion limpia y clara para poder darle mantenimiento a nuestros propios sistemas o a sistemas ajenos.

Veamos este ejemplo de codigo.

public class Elevator {

  public boolean doorOpen = false; // variable que indica si la puerta esta abierta
  public int currentFloor = 1; // entro que indica el piso actual
  public final int TOP_FLOOR = 4; // Constante donde se indica el maximo de pisos
  public final int MIN_FLOOR = 0; // Constante donde se indica el minimo de pisos

  // Metodo openDoor para abrir las puertas modificando la variable openDoor  

  public void openDoor() {
    System.out.println("Abriendo puerta....");
    doorOpen = true;
    System.out.println("La puerta esta abierta.");
  }

  // Metodo closeDoor para cerrar las puertas modificando la variable openDoor  

  public void closeDoor() {
    System.out.println("Cerrando puerta ....");
    doorOpen = false;
    System.out.println("La puerta esta cerrada.");
  }

  // Metodo goUp para aumentar el currentFloor y desplegar en pantalla el piso actual 

  public void goUp() {
    System.out.println("Subiendo un piso.");
    currentFloor++;
    System.out.println("Estamos en el piso: " + currentFloor);
  }

  // Metodo goDown para decrementar el currentFloor  y desplegar en pantalla el piso acutal 

  public void goDown() {
    System.out.println("Bajando un piso.");
    currentFloor--;
    System.out.println("Estamos en el piso: " + currentFloor);
  }

} 
Al ver un codigo asi es mas facil comprender y modificar su estructura, es un hecho. Como un consejo extra, la documentacion tecnica esta bien acompañada de un estandar de codigo esto hace una lectura y comprension tan sencilla que es facil aplicarles mantenimiento a los sistemas ademas de aplicarles optimizaciones.

Herencia

En mi proyecto Determine que la herencia puede aparecer en la clase Articulo y en los Servlets.

La clase Articulo puede derivar a ArticuloGadget.

Ademas la herencia de los servlets esta implicita, ya que la clase Verificador y la clase Registro heredan de HttpServlet.

Hilos de ejecución

Un hilo es una secuencia de instrucciones que está controlada por un scheduler que se comporta como un flujo de control secuencial.

Hablar de hilos es hablar sobre programación concurrente, lo cual da lugar a nuevas necesidades como son la sincronizacion entre hilos y acceso de forma segura a variables u objetos compartidos por un mismo sistema o hilo.

Los Threads tienen un ciclo de vida caracteristico, en el siguiente diagrama de estados se puede apreciar el ciclo.

Como podemos ver en el diagrama, los threads tienen 5 estados característicos.
  • new(Recien creado) - Justo cuando es creado el nuevo hilo, esto sucede al utilizar la palabra reservada new, la cual hace una llamada al constructor de la clase Thread y lo deja listo para su uso.

  • Runnable(Listo para ejecutar) - El hilo estará en estado new hasta el momento en el cual el metodo start() de dicho hilo sea llamado, una vez que este metodo es llamado el hilo pasa a estar en runnable y se puede ejecutar en forma concurrente si la computadora cuenta con varios procesadores ,o bien puede compartir el procesador con los procesos.
A partir de el estado runnable, el hilo puede tomar tres diferentes estados, y estos dependerán del uso que se le proporcione a el hilo.
  • waiting(esperando) - A veces los hilos tienen que esperar a que otros hilos terminen de ejecutarse para poder continuar ( dígase una Entrada/Salida de datos ) entonces si la computadora no dispone de mutiples procesadores solo 1 hilo puede estar en ejecución y para ello, manda a waiting a otro de los hilos que este ocupando el procesador. Ademas el hilo puede quedar en estado waiting si esta en espera de un lock ( usado para sincronizacion entre hilos ), y para volver a su estador de Runnable, puede liberar el candado, o con los metodos de notify/notifyall , aunque esto por lo general lo hacen las algunas librerías de clases ya incluidas en la API.

  • Time waiting( tiempo en espera ) - Este estado es muy parecido al anterior, pero con la diferencia que el mismo hilo se puede liberar, ya que solo queda en espera durante el tiempo que se le asigne. Para mejor referencia puede ver el metodo sleep() en la documentación de java, este metodo hace esperar el flujo de ejecución del hilo actual.

  • Terminated(Terminado) - El ultimo estado en el cual el hilo entra cuando ha terminado su tarea o cuando es cancelado.

Ahora que ya tenemos un poco de teoría sobre los Hilos, pasemos a programar unos cuantos.


En Java los Hilos de ejecución ya están implementados en java.lang.Thread por lo cual no es necesario importar el paquete para poder utilizarlo.

Existen dos formas de iniciar un Thread
- implementado la interface runnable
- heredando desde la misma clase Thread

Si se inicia un Thread implementando una interface runnable solo se necesita redefinir el metodo run() dentro de una clase.
vale la pena destacar que el metodo run() contiene todo lo que el hilo hará, dígase llamadas a otros métodos, creación de objetos, declaración de variables; es lo mismo que un método main.

La pequeña implementacion quedaria algo asi:


public class HiloRunnable implements Runnable{

 public void run(){

System.out.println("Hilo creado desde la interfaz runnable");

}

}


Ahora que ya hemos creado la parte runnable del nuestro hilo podemos crear un thread y pasarle como parámetro nuestro runnable

Este es el constructor de la clase Thread
Thread(Runnable threadOb, String threadName);

donde threadOb es una instancia de la clase que implementa Runnable y threadName es el nombre que le podemos dar para identificar el hilo.

Ahora veamos el siguiente código.

Y no puede faltar el método de prueba con main.

  Aqui esta el codigo


nos da como resultado lo siguiente:
Ahora implementando Thread mediante herencia:

Aqui esta el codigo



y esto obtendremos.



Algunos métodos extras de la clase Threads son:

Join() - el cual sirve para esperar a que el hilo actual termine, hace referencia a conectar uno tras otro los hilos.

sleep() - puedes pausar o terminar el código a ejecutar en el run del thread

yield() - para ser cortes y preguntar que hilo esta libre para ejecutarse, antes de volver a ejecutar el hilo yield.


Referencias:

http://www.reloco.com.ar/prog/java/threads.html
http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/comunica.html
http://www.ctr.unican.es/asignaturas/procodis_3_II/Doc/Procodis_3_01.pdfhttp://perseo.cs.buap.mx/~danguer/projects/curso_java/manual/node5.html
http://trevinca.ei.uvigo.es/~formella/doc/cd04/node37.html
Imagenes propias.

Modelado de Clases del Proyecto

Para el proyecto del carro web de compras las clases que se consideran importantes a implementar son las siguientes.
-Desgraciadamente aun no tengo claro si el uso de bases de datos me oblige a utilizar nuevos atributos, asi que hasta no investigarlos los agregare.


Clase:
    public Accesos
             importancia:
              esta clase es sumamente importante porque sin ella el sistema no se puede accesar,
              posiblemente se utilize como interface, ya que puede usarse para el
               Log In, Log Out y la  Autentificacion de Usuario.

Atributos

  •     protected-Usuario(clase)   usuario
Metodos
            VerificarUsuario(String nombre, String password)
                Recibe como parametro la respuesta del llenado del formulario de
                verificacion de usuario y despues se hace una consulta
                a la base de datos, y se le asignan valores a la clase Usuario.
 



Clase:
    public Usuario
                importancia:
                   con esta clase se manejaran los datos del usuario, 
                   importantes ya que para ellos fue creado el sistema.
Atributos
  •   private-String     nombres
  •   private-String     apellidoMaterno
  •   private-String     apellidoPaterno
  •   private-String     password
  •   private-double    efectivoDisponible
  •   private-int          idUsuario
  •   private-boolean  administrador
Metodos
         Usuario(String nombres, String apellidoMaterno, String ApellidoPaterno,
                      String password, double efectivoDisponible,
                        int idUsuario, boolean administrador )
              El usuario es creado recibiendo como parametros los atributos
               que son sustraidos de la base de datos.

            VerificarDatos(void)
                El usuario puede ver los valores registrados en su cuenta.
     

           ModificarDatos(dato a modificar)
                se accede a la base de datos 
                y se modifica el valor de dato que se requiere.
     



Clase:
    public ManejadorBD
             importancia:
              Sin el majeador de la base de datos este software no tiene razon de ser.

Atributos

  •     protected-Conecction   
Metodos
            VerificarUsuario(String nombre, String password)
                Recibe como parametro la respuesta del llenado del formulario de
                verificacion de usuario y despues se hace una consulta
                a la base de datos, y se le asignan valores a la clase Usuario.

Primer Programa Orientado a Objetos

En esta entrada del blog se registrara el primer programa orientado a objetos para la clase del taller.

Se especifico que el programa deberia contener:


Por lo menos la creacion de dos objetos.
La clase debera contener por los menos dos atributos.
Utilizar el paradigma de OO.
Por lo menos un metodo.


Bien pasemos a la pequeña descripcion.

Decidi crear como ejemplo una clase Monitor 
y tambien la clase PruebaMonitor para realizar las pruebas.


Los atributos que contiene son:

  • Estado del monitor, un boolean por ende puede ser True o False
  • Contraste, un int de rango 0 a 100
  • Id, un String para diferenciar un monitor de otro.
En cuanto a los metodos, se explican en el codigo, pero a grosso modo son:
  • Encender Monitor, no recibe parametros
  • Apagar Monitor, no recibe parametros
  • Subir Contraste, recibe la cantidad entera de contraste a subir.
  • Bajar Contraste, recibe la cantidad entera de contraste a bajar
  • Get Id, no recibe parametros.
He aqui el codigo de la clase Monitor


Este es el codigo para probar los objetos de la clase monitor.


Ahora veamos que el codigo se ejecuta tal cual es llamado junto al main de la clase PruebaMonitor para verificar que se ejecute correctamente.



Casos De Uso Para El Proyecto

En esta entrada presentare la tabla que escribi con el formato que la Doctora Sara nos sugirió.

Lo que mas destaca es el hecho de que si el usuario o el administrador no hace Log In practicamente no se puede hacer nada.

Ambos actores usuario y administrador, comparten muchas caracteristicas a excepcion del administrador que como es obio tiene mayor cantidad de permisos en cuanto a modificacion y uso del sistema.

Definicion del Proyecto

Despues de mucho meditarlo, decidi implementar un software de un carro de compras web.

Porque?
Bueno existen dos buenas razones, la primera es que deseo implementar sobre la web, en segunda despues de una platica con un empresario me comento sobre la falta de profesionalismo departe de los programadores en cuanto a carros de compra web, lo cual me impulsa a comprobar el porque es tan dificil hacer uno.

Descripcion detallada.

El usuario podra acceder a una pagina de incio en la cual necesitara registrarse o acceder a su cuenta, despues pasara a el menu de usuario donde podra validar sus datos, nombre, edad, apellido, trabajo, cantidad de efectivo disponible e historial de transacciones. Si todos los datos son correctos y el cliente esta conforme, tendra la opcion de pasar a realizar sus compras en determinada tienda o sucursal.
Estando en la sucursal o tienda de su preferencia, podra buscar los articulos que necesita o simplemente inspeccionar que articulo tiene disponible la tienda, si el cliente encuentra algun articulo de su agrado puede agregarlo su carro web de compras. El usuario podra verificar en cualquier momento el estado de su carro de compras, la cantidad de articulos que tiene y sus precios, al verificar el estado de su carro se le proporcionara el usuario el coste total de los articulos actualmente seleccionados para que tome en cuenta el efectivo que dispone. Tambien desde la opcion de verificacion podra remover articulos de su carro de compras.

Tambien estara el usuario especial, un administrador el cual podra modificar a placer la base de datos para agregar articulos, modificarlos, borrarlos, y agregar efectivo a los usuarios.

Porque el administrador podra agregar efectivo a los usuarios?
la respuesta a ello, es porque no se manejan tarjetas de credito, ni depositos, la forma de abonar dinero es directamente con el administrador(digase empresa) para que al momento de su "deposito" el administrador personalmente le agrege dicha cantidad a la cuenta del usuario.

En cuanto a los articulos a vender, la idea es que sean libros principalmente pero se pueden agregar mas  articulos dependiendo las necesidades.



Carro de compras web




- Funciones -

  Acceder como usuario. 
Log in/out


  Verificar datos de la cuenta. 
Comprobacion de datos


  Modificar datos de la cuenta. 
Modificacion de datos


  Añadir objetos al carro. 
Añadir compra


  Quitar objetos del carro. 
Remover compra


  Verificar los objetos del carro. 
Checar articulos a comprar





Sobre la implementacion.

Pienso usar como lenguaje de programacion Java.
Concretamente pienso utilizar Servlets y Java Server Pages para la implementacion final, tambien usare el Rdbms Mysql para el uso de bases de datos.


Referencia:

Imagen carro de compras web
http://www.jevaplastic.com.mx/persona-con-carrito-de-compras-245x300.gif

referencia de Mysql
http://www.mysql.com/

referencia de los JSP
http://www.desarrolloweb.com/articulos/831.php

referencia de los Servlets de java
http://www.oracle.com/technetwork/java/javaee/servlet/index.html