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.

miércoles, 19 de marzo de 2008

Habemus facebook

Llevo un par de semanas trasteando con facebook por culpa, en parte, de mi amigo Yorch. La aplicación en si es bastante difícil de manejar, te pierdes un poco por sus menús hasta que te acostumbras pero una vez lo haces la verdad es que es bastante completa.

El caso es que hace unos cuantos días estaba curioseando por los grupos y me llevé la sorpresa de no encontrar más que un par de grupos sobre PHP en español y además vinculados a la red "Spain" y, en su nombre, a ciudades. Así que se me ocurrió la ¿genial? idea de crear el grupo PHP y desarrollo web en español por supuesto en la red global.

Estoy publicando allí enlaces a posts de este blog que me parecen relevantes y aprovecho para invitar a todos a que hagan lo mismo ya que la publicación está permitida a todos, claro que es necesario tener cuenta en facebook.

lunes, 17 de marzo de 2008

Zend Technologies publica Zend Framework 1.5

Desde hace un par de días se venía rumoreando que estaba próximo el lanzamiento de ZF 1.5 que finalmente se ha producido hoy.

Si se lee el comunicado observamos como se nombran unas cuantas grandes marcas que están utilizando este framework y cómo se está potenciando la integración de los APIs de Google. Todo parece indicar que se trata de una estrategia de Zend Technologies para atraer a los desarrolladores.

Sin embargo el producto sigue siendo inferior a otros competidores en cuanto a potencia y sobre todo comunidad. Sigo pensando que Zend debe potenciar este último factor con acciones como integrar ZF en PDT.


Technorati Tags: , , ,

domingo, 16 de marzo de 2008

¡Quiero probar Dropbox!

Dropbox es algo así como un subversion para uso personal, me explico porque la idea me parece muy buena:

Por lo que se puede ver en el vídeo, se trata de un repositorio remoto personal gestionable mediante web por un lado. Por otro entiendo que te instalas en tu PC un cliente y configuras una ruta o carpeta de trabajo donde depositas los archivos a controlar.

¿Y que utilidad tiene eso? Bueno dicho así no mucha, pero si tienes un par de ordenadores en casa o te interesa compartir información entre el de tu casa y el pc de tu oficina la cosa es bastante interesante.

A mi me valdría la pena simplemente por un archivo en el que recojo información sobre mis salidas mtb desde hace cuatro años. Actualmente se encuentra en mi PC sobremesa y me falta introducir unas cuatro o cinco salidas sólo por la pereza que me da enchufar ese ordenador (normalmente uso en casa un portátil de empresa). Con Dropbox podría actualizar ese archivo desde ambos ordenadores de forma fácil. Además en estos momentos mi sobremesa no arranca y tal vez sea el disco, con lo que si la última copia de seguridad que hice de ese archivo tiene dos meses habré perdido bastante información, ni que decir tiene que Dropbox también nos protege de esos problemas

En fin, lo cierto es que hoy por hoy se trata de una beta privada y ya tengo solicitada una invitación, pero hasta que llegue se me hacen los dientes largos.


Technorati Tags:

miércoles, 12 de marzo de 2008

Symfony vs Zend Framework. 4- ¿Cuál nos quedamos?

Artículos de la serie:
  1. Definición del problema
  2. Comencemos con Symfony
  3. Turno de Zend Framework
  4. ¿Cuál nos quedamos?
Después de que en la primera parte definieramos los requisitos de una pequeña aplicación y las implementásemos en los dos siguientes capítulos con los correspondientes frameworks, llega el momento de sacar unas cuantas conclusiones. Recordemos que el punto de vista de esta comparación es el de alguien que sólo ha dedicado unas cuantas horas a cada uno de los dos, así que debemos ser conscientes de que solo hemos visto la punta del iceberg y que tal vez por ello las conclusiones no sean del todo justas.

Forma de trabajo

En primer lugar hay ciertas diferencias a la hora de trabajar con ellos. Symfony hace uso de la linea de comandos para facilitarnos muchas tareas monótonas mintras que ZF todavía no lo incorpora. Cuando este último posea esta carácterística habrá que analizar si realmente equivaldría al otro en cuanto a funcionalidades. Por otro lado en Symfony tendremos que crear y retocar archivos YAML para ciertas cosas como validar formularios y como configuración de diversos aspectos.

A parte de esto, la forma de trabajar será muy parecida debido a que ambos responden a un patrón MVC y tendremos que recurrir continuamente a modificar clases relativas a acciones, revisar archivos plantilla, etc.

Curva de aprendizaje

Aquí toma clara ventaja ZF porque símplemente hemos de documentarnos a través de la guía de referencia para conocer las clases existentes y sus funciones. En Symfony, además de lo anterior, tendremos que familiarizarnos con Yaml, averiguar que podemos hacer y que no con los comandos de CLI y manejarnos por diferentes archivos de configuración, lo que implica familiarizarse con la estructura de archivos del proyecto.

La guerra de los plugins

Es posible encontrar una gran cantidad de plugins no oficiales para Symfony los cuales se pueden instalar, como no, haciendo uso de la linea de comando. Por otro lado ZF no distingue como plugins una serie de clases que tendrían que ver con la utilización de APIs externos, ya que forman parte de la distribución, pero sí que los identifica como servicios (Zend_Service_Amazon, Zend_Service_Flickr, etc) Es posible que nuestra elección deba centrarse en este aspecto si queremos comenzar un proyecto de tipo mashup y aquí Symfony tiene ventaja por la gran cantidad de recursos que pone a nuestra disposición.

Comandos sí o no

ZF necesita incorporar los comandos de CLI para llegar a la altura de Symfony, deberían darle un empujón definitivo a ese aspecto. De todos modos hay partidarios de no utilizarlos así que este hecho puede ser determinante para la gente que se posicione al respecto.

Otros aspectos

Otros puntos a favor de Symfony, aunque no he llegado a probarlos, son el soporte que proporciona para tests unitarios y funcionales, la integración de subversion y la sincronización de código entre los entornos de desarrollo, pruebas y producción.

Conclusiones

Desde mi punto de vista Symfony goza de ventaja sobre ZF por poseer los comandos de CLI , la gran cantidad de plugins exsitentes, el entorno de desarrollo con el menú flotante de información de debug, soporte para tests, etc.

Además de todo esto puede incluir a ZF como una biblioteca de clases. De hecho puede hacer esto mismo con otros frameworks. Para incluir ZF haríamos esto:

Declarar en settings.yml
.settings:
zend_lib_dir: /usr/local/zend/library/
Después extenderíamos la rutina autoload
.settings:
autoloading_functions:
- [sfZendFrameworkBridge, autoload]

Además Symfony cuenta con una gran comunidad que a parte de los plugins puede ofrecer algún extra interesante como Symfoclipse que nos permite usar los comandos de este a través de Eclipse en un menú contextual.



Por contra ZF goza de la simplicidad de aprendizaje que hemos comentado anteriormente, la libertad a la hora de definir nuestras estructuras de archivos y la flexibilidad a la hora de instanciar clases que comentamos en el capítulo precedente.

Algo que podría hacer Zend Technologies para impulsar su framework sería integrarlo con el entorno PDT de Eclipse. Estaría muy bien encontrar en el menú de creación de proyectos algo así como "Nuevo proyecto Zend Framework" y que al elegirlo nos creara una estructura de archivos inicial para adelantarnos trabajo, además, es algo que ya incorpora Zend Studio. En segundo lugar, por supuesto, tiene que potenciar como sea a la comunidad de desarrolladores para que creen mas "clases servicio". Es cierto que están haciendo un gran esfuerzo y que ZF crece rápidamente, está ganando muchos adeptos y por tanto están surgiendo muchas webs que lo utilizan.


Estamos ante dos rivales destinados a luchar una larga batalla y aunque, para mí, uno tenga ventaja, estoy seguro de que el otro irá recortando la diferencia. Deberemos elegir uno u otro en función de las situación que nos encontremos: sí se desea simplicidad y no perder mucho tiempo en la fase de aprendizaje ZF será lo más apropiado. Por el contrario, Symfony es mucho más completo y dispone de muchos, muchos más plugins. Hoy por hoy si tuviera que escoger uno de ellos elegiría Symfony pero ya veremos dentro de unos meses.