Mostrando entradas con la etiqueta uml. Mostrar todas las entradas
Mostrando entradas con la etiqueta uml. Mostrar todas las entradas

martes, 22 de abril de 2008

Posts de interés

No os voy a contar mi vida. Sólo diré que estoy en horas bajas y no puedo terminar ninguno de los artículos que tengo pendientes, así que os dejo algunos posts interesantes que he leído estas últimas semanas.

Joomla y capa de presentación para móviles. De uno de los tipos que más sabe sobe presentación móvil. Interesante artículo para aquellos que quieran adaptar su aplicación Joomla a terminales móviles.

Presentación
sobre testeos con PHPUnit, DBUnit, etc. Una buena lectura para iniciarse con PHPUnit y demás-

Guerra de frameworks. Respuesta de un desarrollador Symfony a otr de Rubi on Rails ¿Que puedo decir? si alguien se enzarza en una guerra dialéctica más vale saber de que se habla.


Peticiones simultaneas en PHP usando CURL. En realidad no son tan simultaneas y recomiendo probar su viabilidad antes de implantarlo. En nuestro caso finalmente lo desechamos.

Situación del UML. Esta es la causa de mi anterior post sobre el uso de UML.

Modelo de contrato ágil
. Solo es un patrón pero me parece interesante.

miércoles, 9 de abril de 2008

Sobre el uso de UML

Hace un par de días el autor de uno de mis blogs preferidos se preguntaba si el UML estaba pasado de moda. Lo del uso o desuso del UML es un tema que me toca la fibra. En principio yo pienso que no ha terminado de extenderse todo lo que se presumía, pero aún así lo creo algo imprescindible y a mi modo de ver se irá propagando poco a poco.

Uno de los primeros problemas que veo es el modo en el que empezó a enseñarse. Los que como yo lo hayáis estudiado hace unos siete años, seguramente, habréis aprendido toda una metodología cerrada en la que empezabais por los casos de uso, seguías con los diagramas de clases y así sucesivamente en un orden fijo preestablecido, bastante aburrido por cierto, en el que lo último que dibujaríais sería el diagrama de despliegue. Ni que decir tiene que en mi caso me limité a aprobar la asignatura y después lo dejé un poco de lado (ummm ¿no hice eso con casi todas? ¡Ah! ¡No! Hice esa carrera por que me gustaba :p ).

Afortunadamente parece que este modo de ver las cosas ha ido cambiando. En realidad todo es mucho más flexible pero tal vez no hemos entendido aún que hay miles de formas de usar UML y su uso tiene que ser diferente en base al perfil de quien lo haga:
  • Un programador debe saber "leer" UML y no tiene por qué escribirlo. Parece una tontería pero leer bien un diagrama de clases que modela el diseño de una parte de la aplicación significa que sabremos como escribir el código de esas clases: una herencia se convertirá en un "extends" (fácil), pero ¿y una agregación? ¿y una composición? Esto implica también que quien haga el diseño debe saber lo que está pintando ya que repercutirá en el código.
  • Probablemente las capas altas de tu organización y los clientes finales no habrán ni oído hablar de este lenguaje, así que mostrarles un diagrama de interacción o estados puede ser bastante inútil. Sin embargo no se debe desechar la posibilidad de enseñarles algún diagrama de casos de uso, despliegue, o incluso de clases orientado al análisis (preferiblemente representando las clases como cajas simples, sin los compartimentos de atributos y métodos).
  • Por supuesto que los que se encuentren entre los dos extremos (analistas de cualquier tipo, coordinadores, etc.) deberían saber leer y escribir UML.
Por otro lado es muy importante escoger la herramienta CASE correcta para nuestras necesidades. No creo que mucha gente que se desenvuelva con Java o .Net escogiera ArgoUML como herramienta pero, como dije hace un par de posts, para un escenario basado en PHP puede ser una opción muy interesante.

Una vez escogida la herramienta más adecuada la forma de aplicar UML vendrá determinada en gran medida por el entorno en el que nos encontremos. Puede influir en ello la carga de trabajo, los conocimientos de UML de todo el equipo de trabajo, la naturaleza de los proyectos, etc.

En definitiva cada equipo debe encontrar su modo idóneo de utilizar UML, los ingenieros debemos acostumbrar a programadores y altos mandos a recibir pequeñas raciones de diagramas cuando lo creamos necesario. No olvidemos tampoco que en este país muchos ponen en duda que nuestro trabajo sea una ingeniería y en parte se debe a que todas nuestras metodologías de trabajo están verdes, por eso creo, aplicando un símil con el mundo de la construcción (como no) que nuestra herramienta CASE debe ser lo mismo para nosotros que el AutoCAD para un arquitecto.

domingo, 23 de marzo de 2008

Modelando con ArgoUML aplicaciones en PHP

Sobre ArgoUML

ArgoUML (Argo para abreviar) es una de esas aplicaciones que dan la impresión de no ser utilizadas por mucha gente pero que, sin embargo, continúan desarrollandose con un ritmo incansable. Para los que no lo sepan se trata de una herramienta CASE para modelar software en UML.

En mi caso elegí Argo porque quería modelar con una herramienta libre que me generase código en PHP. Además debería correr tanto en Windows como en Linux.

Pero antes de eso y después de probar unas cuantas herramientas veía difícil encontrar una aplicación que cumpliera estos tres requisitos: podía producir código PHP con Umbrello pero no corría en Windows, Visual Paradigm era hasta bonito pero no libre, etc. Finalmente llegué hasta Argo y aunque en una primer vistazo puede parecer una herramienta tosca en comparación con otras, cuando te acostumbras te das cuenta de que es bastante rápido trabajar con ella.


Para los fanáticos de Eclipse existe un proyecto paralelo llamado argoeclipse que nos permite tenerlo integrado en dicho IDE. Sin embargo este proyecto siempre va un paso por detrás de su hermano mayor y creo que cuando lo probé no generaba código PHP.


Modelando

Tenemos a nuestra disposición los diagramas de casos de uso, clases, secuencia, colaboración, estado y despliegue.


Particularmente suelo utilizar el de casos de uso para definir historias o partes del entorno de usuario, el de clases para el análisis, desarrollo y documentación.








Ocasionalmente uso el de actividades para definir algún proceso que me interesa plasmar por su complejidad y el de despliegue como apoyo de algún documento.


Dada su flexibilidad, no importa que tipo de modelado queramos hacer. Por ejemplo, para un diagrama de clases, si modelamos desde el punto de vista del diseño de aplicación podemos ocultar atributos y funciones:

Por el contrario podemos profundizar un poco más en el análisis y definir atributos y funciones de las clases:

Por último si modelamos orientado a la implementación conviene que veamos la privacidad y los parámetros que utilizamos:


También nos es muy útil para documentar independientemente del nivel al que modelemos, ya que podemos insertar documentación sobre las clases, atributos, funciones, etc. Cuando generémos el código se nos insertarán los comentarios de forma que más tarde podremos procesarlo mediante PHPDocumentor y obtener un pdf o páginas html de documentación.

En la práctica

Volviendo a los diagramas que se pueden ver más arriba imaginemos que después de definir los casos de uso y de hacer un modelado de las clases a nivel de diseño, vamos profundizando hasta el punto de vista de implementación. Llegados a este punto es el momento de generar código. Para ello nos vamos hasta nuestro diagrama de clases y elegimos en el menú Generar la opción Generar todas las clases... y elegimos las clases que queramos generar y la ruta donde se crearán los archivos.



Después de esto obtendremos un fichero por cada una de las clases, por ejemplo para la clase artículo tendremos:


if (0 > version_compare(PHP_VERSION, '5')) {
die('This file was generated for PHP 5');
}

/**
* include Comentario
*
* @author firstname and lastname of author, author@example.org
*/
require_once('class.Comentario.php');

/* user defined includes */
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-includes begin
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-includes end

/* user defined constants */
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-constants begin
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-constants end

/**
* Esta clase representa los artículos que se escriben para el blog.
*
* @access public
* @author firstname and lastname of author, author@example.org
*/
class Articulo
{
// --- ATTRIBUTES ---

/**
* Identificador único
*
* @access private
* @var Integer
*/
private $idarticulo = null;

/**
* Título del artículo
*
* @access private
* @var String
*/
private $titulo = null;

/**
* Texto del artículo
*
* @access private
* @var String
*/
private $cuerpo = null;

/**
* Fecha de creación
*
* @access private
* @var Integer
*/
private $fecha_creacion = null;

// --- OPERATIONS ---

/**
* En realidad esta función debería insertar un nuevo
* artículo en la BD pero de momento sólo tiene código de prueba
*
* @access public
* @author firstname and lastname of author, author@example.org
* @param String titulo
* @param String cuerpo
* @return Boolean
*/
public function nuevoArticulo( String $titulo, String $cuerpo)
{
$returnValue = null;

// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C begin
// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C end

return $returnValue;
}

} /* end of class Articulo */



Como se puede observar hay comentarios introducidos por nosotros y unas extrañas marcas que nos permitirán volver a generar código sin perder lo que hayamos escrito entre ellas. Por ejemplo añadimos la instrucción:


$returnValue=true;


o sea:


public function nuevoArticulo( String $titulo, String $cuerpo)
{
$returnValue = null;

// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C begin
$returnValue=true;
// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C end

return $returnValue;
}


Ahora volvemos a Argo, añadimos otra función y volvemos a generar código:



*/

if (0 > version_compare(PHP_VERSION, '5')) {
die('This file was generated for PHP 5');
}

/**
* include Comentario
*
* @author firstname and lastname of author, author@example.org
*/
require_once('class.Comentario.php');

/* user defined includes */
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-includes begin
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-includes end

/* user defined constants */
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-constants begin
// section -84-16-6-101-32d97df8:117d1aeef8e:-8000:0000000000000846-constants end

/**
* Esta clase representa los artículos que se escriben para el blog.
*
* @access public
* @author firstname and lastname of author, author@example.org
*/
class Articulo
{
// --- ATTRIBUTES ---

/**
* Identificador único
*
* @access private
* @var Integer
*/
private $idarticulo = null;

/**
* Título del artículo
*
* @access private
* @var String
*/
private $titulo = null;

/**
* Texto del artículo
*
* @access private
* @var String
*/
private $cuerpo = null;

/**
* Fecha de creación
*
* @access private
* @var Integer
*/
private $fecha_creacion = null;

// --- OPERATIONS ---

/**
* En realidad esta función debería insertar un nuevo
* artículo en la BD pero de momento sólo tiene código de prueba
*
* @access public
* @author firstname and lastname of author, author@example.org
* @param String titulo
* @param String cuerpo
* @return Boolean
*/
public function nuevoArticulo( String $titulo, String $cuerpo)
{
$returnValue = null;

// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C begin
$returnValue=true;
// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000086C end

return $returnValue;
}

/**
* Esta función debería borrar el artículo identificado mediante id.
*
* @access public
* @author firstname and lastname of author, author@example.org
* @param Integer id
* @return mixed
*/
public function borraArticulo( Integer $id)
{
// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000088C begin
// section -84-16-6-100--4073085f:118d2dc4603:-8000:000000000000088C end
}

} /* end of class Articulo */

?>


¡Nuestro código sigue ahí!

Por último pasamos el proyecto por PHPDocumentor y obtenemos la documentación correspondiente.



Y eso es básicamente todo, si trabajáis en Web con PHP, os gusta modelar y tenéis tiempo para ello, ArgoUML es una gran elección.