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.
Publicar un comentario