martes, 30 de diciembre de 2008

Eclipse PDT 2.0 lanzado

Eclipse 3.4 GanymedeEclipse PDT 2.0 estable fue lanzado hace poco oficialmente, el 26 de Diciembre del 2008 y tiene muchas novedades.

La primera gran novedad es que está basado en la versión 3.4 Eclipse Ganymade y todas sus ventajas que conlleva estar basada en ella.

Se asume que esta versión es más lijera que la anterior. Lo que si es un hecho que el instalador pesa menos :)

Una nueva característica que rápidamente notaremos es en el Explorador de archivos PHP. Tenemos la posibilidad de separar nuestros recursos de aplicación, con las librerías js y estilos css, esto hace nuestro proyecto más modular desde la perspectiva del IDE. Además ahora también incluye la librería de funciones y clases de PHP nativa.

Una nueva característica son los @property y @method en PHPdoc, que nos ayudará en el asistente de autocompletado para propiedades y métodos que deseamos que aparezcan(y no aparecían). Por ejemplo propiedades que publicamos a través del método mágico _get.

Existen más características propia de la orientación a objetos de PHP que han incluído en el IDE. Seguiré testeando esta nueva versión para seguir posteando mis apreciaciones.

Anímate ya está para la descarga el All-in-One tanto para Linux, MAc y Windows : http://www.eclipse.org/pdt/

lunes, 15 de diciembre de 2008

Generando código PHP desde UML

Creative Commons License

Esta obra está bajo una licencia de Creative Commons.

© 2008 Jaime M. Tan Nozawa. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.


Continuando con el artículo de herramientas CASE UML para PHP 5, veremos ahora la creación de código a partir de un diagrama de clases de dos herramientas: BoUML y ArgoUML.

Indice de secciones:
  1. Revisando la generación de código
  2. Revisando las asociaciones entre clases
    1. Dependencia
    2. Asociación simple
    3. Asociación de agregación y composición
    4. Asociación de generalización

1) Revisando la generación de código








Clase creada en ArgoUML / Clase Creada en BoUml

Se ha una clase Carrito, pero en diferentes herramientas. Veamos el código generado

>> Código generado en BoUML <<
Se puede verificar lo siguiente:
  • Vemos que genera el nombre de clase en PHP con el mismo nombre que en el UML
  • IMPORTANTE: Dispone de unas etiquetas de comentario // Bouml preserved body begin/end que permitirá evitar la sobre-escritura de tus implementaciones una vez que hayas generado tu código
  • Detectó bien la inicialización de un atributo y la visibilidad
  • Se crea las carpeta según el paquete donde se encuentra (previa configuración)
  • PROBLEMA: Los valores de retorno siempre son null, a pesar de haberle especificado entero o cadena.
  • PROBLEMA: Se crea un comentario, pero no comenta el tipo de dato de los atributos, los parámetros del método o la visibilidad.
<?php

/**
* Clase Carrito de compras
*/
class Carrito {
/**
* Cantidad de productos en el carrito
*/
private $cantidad = 0;

/**
* Contructor
*/
public function __construct()
{
// Bouml preserved body begin 0001F503

$return=NULL;

return($return);
// Bouml preserved body end 0001F503
}

public function count()
{
// Bouml preserved body begin 0001F583

$return=NULL;

return($return);
// Bouml preserved body end 0001F583
}

public function guardar()
{
// Bouml preserved body begin 0001F603

$return=NULL;

return($return);
// Bouml preserved body end 0001F603
}

}
?>

>>Código generado en ArgoUML<<
Se puede verificar lo siguiente:
  • Vemos que genera el nombre de clase en PHP con el estilo de formato largo, con el separados underline(_) y como prefijo al nombre original en UML
  • Se crea un comentario estilo PHPdoc, lo realizo de forma excelente documentando casi todo. Inclusive el creador, fecha y otros detalles minucios.
  • Dispone de unas etiquetas de comentario similares al BoUML, que permitirá evitar la sobre-escritura de tus implementaciones una vez que hayas generado tu código
  • Los valores de retorno son detectado, inclusive te realiza un cast de las variables.
  • Detectó bien la inicialización de un atributo y la visibilidad
  • Te genera una carpeta por paquete.
  • Dispone de unas secciones especiales como /* user defined includes */ para agregar includes o requires y no ser sobre-escritos.
  • Para generar un tipo String, se debe especificar el tipo "char"
  • Problema: Tiene demasiado "código extra", un código para detectar si es PHP 5, y fuerza mostrar los errores inclusive los de tipo "Notice".
  • Te crea un include para cada archivo donde se aloja la clase que necesitas. si esta clase estuviera relacionada a muchas otras generaría mucho código (una para cada asociacion). Este código se consideraría tambien "extra" o "de más" si es que utilizamos el método mágico __autoload, para la carga automática de clases. O bueno claro! con los namespaces que vienen ya en PHP 5.3
<?php

error_reporting(E_ALL);

/**
* Modelo Test PHP 5 y UML - modelo\class.Carrito.php
*
* $Id$
*
* This file is part of Modelo Test PHP 5 y UML.
*
* Automatically generated on 16.12.2008, 00:46:11 with ArgoUML PHP module
* (last revised $Date: 2008-04-19 08:22:08 +0200 (Sat, 19 Apr 2008) $)
*
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @package modelo
*/

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

/* user defined includes */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes end

/* user defined constants */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants end

/**
* Short description of class modelo_Carrito
*
* @access private
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @package modelo
*/
class modelo_Carrito
{
// --- ASSOCIATIONS ---


// --- ATTRIBUTES ---

/**
* Short description of attribute cantidad
*
* @access private
* @var int
*/
private $cantidad = 0;

// --- OPERATIONS ---

/**
* Short description of method __construct
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return void
*/
public function __construct()
{
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CFA begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CFA end
}

/**
* Short description of method count
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return int
*/
public function count()
{
$returnValue = (int) 0;

// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF4 begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF4 end

return (int) $returnValue;
}

/**
* Short description of method guardar
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return boolean
*/
public function guardar()
{
$returnValue = (bool) false;

// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF6 begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF6 end

return (bool) $returnValue;
}

} /* end of class modelo_Carrito */

?>



2) Revisando las asociaciones entre clases
Analizaremos varias asociaciones entre clases y la generación del código en PHP:

Asociacion de dependencia
Es una relación de uso, es decir una clase usa a otra, que la necesita para su cometido. Se representa con una flecha discontinua va desde la clase utilizadora a la clase utilizada. Con la dependencia mostramos que un cambio en la clase utilizada puede afectar al funcionamiento de la clase utilizadora, pero no al contrario.



ArgoUML





BoUml




>>Código generado en BoUML<<
No hubo ningún cambio en el código con ésta asociación

>>Código generado en ArgoUML<<
Por la linea 22, antes de los includes de usuario del código ArgoUML generado anteriormente, se insertan estas nuevas lineas. La clase utilizadora(dependiente) "Carrito", realiza un include_once a la clase utilizada "BD". Ésto implica que dentro de la vida de un objeto Carrito requerirá llamar a un método o una instancia de BD.

/**
* include modelo_BD
*
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
*/
require_once('modelo/class.BD.php');


Asociacion simple
Permite asociar objetos que colaboran entre si. La diferencia con la dependencia radica en que se guarda una referencia de la otra clase.
Esta asociación dispone de navegabilidad, esta dirección significa que uno puede obtener o "ver" el objeto apuntado, a través del objeto cliente. También implica, al igual que la dependencia, el llamar a un método u obtener la instancia de una clase.



ArgoUml




BoUml



>>Código generado en BoUML<<
Para Bouml es necesario crearle el atributo donde guardará la referencia a la clase, esta se encontrará en los extremos de la asociación. En este caso Carrito solita una instancia de BD, y esta se almacenará en el nuevo atributo "conexion".
Revisar al final del código, notar que generó un atributo más


<?php

/**
 * Clase Carrito de compras
 */
class Carrito {
  /**
   * Cantidad de productos en el carrito
   */
  private $cantidad = 0;

  /**
   * Contructor
   */
  public function __construct()
  {
    // Bouml preserved body begin 0001F503

$return=NULL;

return($return);
    // Bouml preserved body end 0001F503
  }

  public function count()
  {
    // Bouml preserved body begin 0001F583

$return=NULL;

return($return);
    // Bouml preserved body end 0001F583
  }

  public function guardar()
  {
    // Bouml preserved body begin 0001F603

$return=NULL;

return($return);
    // Bouml preserved body end 0001F603
  }

  /**
   * instacion de clase DB en asociacion conexion
   */
  private $conexion = null;

}
?>

>>Código generado en ArgoUML<<
En ArgoUML no se crea el atributo en la clase Carrito, pero si crea un comentario sobre la asociación y el nombre bautizado para el extremo. Por ello he creado manualmente un atributo "conexion" en la clase.
OJO, solo puse la primera parte: revisar la linea 47 y 48 del código
<?php

error_reporting(E_ALL);

/**
 * Modelo Test PHP 5 y UML - modelo\class.Carrito.php
 *
 * $Id$
 *
 * This file is part of Modelo Test PHP 5 y UML.
 *
 * Automatically generated on 16.12.2008, 01:57:32 with ArgoUML PHP module 
 * (last revised $Date: 2008-04-19 08:22:08 +0200 (Sat, 19 Apr 2008) $)
 *
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 * @package modelo
 */

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

/**
 * include modelo_BD
 *
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 */
require_once('modelo/class.BD.php');

/* user defined includes */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes end

/* user defined constants */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants end

/**
 * Short description of class modelo_Carrito
 *
 * @access private
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 * @package modelo
 */
class modelo_Carrito
{
    // --- ASSOCIATIONS ---
    // generateAssociationEnd : conexion

    // --- ATTRIBUTES ---

    /**
     * Short description of attribute cantidad
     *
     * @access private
     * @var int
     */
    private $cantidad = 0;

    // --- OPERATIONS ---

Continuará... con multiplicidad, agregación/composición y generalización

martes, 9 de diciembre de 2008

UML y PHP: Herramientas Case

Creative Commons License

Esta obra está bajo una licencia de Creative Commons.

© 2008 Jaime M. Tan Nozawa. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.



Después de haber analizado el negocio y haber realizado tus workflow de procesos, es hora de comenzar a diseñar (y analizar) la arquitectura de tu sistema.

La gran pregunta para todo desarrollador y arquitecto de software que implementará en PHP sería: qué herramientas CASE dispongo, hay alguna libre... y éstas me generarán código PHP ? y código PHP 5 si pido mucho???

Pues les listaré los que a los largo de estos años he podido testear:

StarUML : Interesante herramienta, es perfecta para la documentación usando la metodología RUP, los que vienen de utilizar Rational Rose, esta herramienta les parecerá ser un clon casi idéntico (inclusive en los colores). Tienes la posibilidad de crear íconos para tus estereotipos y crear tus propios profiles. (Digamos que puedo crear mi Profile para modelar para Zend Framework o un MVC propio más "abierto"). Su interfaz es ligera y agradable. utiliza UML 2.0.

La generación de código para PHP 5: intermedio ***
Utiliza un método de "templates", en el cual uno puede inclusive modificar el código que generará. Detecta agregación y composición y genera automáticamente el atributo en la "clase cliente"

Desventaja :
- Solo corre en Windows
- El código generado "chanca" (sobre-escribe) el código anterior generado.
- La generación de clases las crea sin tomar en cuenta el paquete donde se encuentra.
- Puedes crear Diagramas E-R pero al final no genera nada de SQL.
- No dispone de ingeniería reversa para PHP.


ArgoUML :
ArgoUML es una de esas joyitas libres hechas encajadas perfectas para JAVA, por suerte estos últimos años ha tomado en cuenta a PHP y su capacidad orientación a objetos y tenemos esta gran herramienta para PHP. Ahh!!...Por cierto esta es la que uso.

La generación de código para PHP 5: Excelente *****
Tiene la capacidad de generar código PHP 5 y seguir desarrollando paralelamente (no chanca el código), dispone de unas etiquetas de comentario que evitan la sobre-escritura de métodos. La generación de código la realiza usando la técnica de clases de nombres largos: presentacion_UCCcontrollers_gestionarPrestamo.php
Aunque ya estamos a puertas de los namespaces de PHP 5.3 y PHP 6, aún sigue siendo la única "forma simple" de dar pertenencia de una clase a una paquete.

>> Corre en Linux y en Windows <<

Desventajas:

- Es muy pesado y requiere de mucha memoria principal.
- Sigue utilizando UML 1.4, la interfaz no es tan agadable ni dispone de íconos para reconocer los estereotipos. (es un problema identificar mis clases controladoras con las de datos).
- Aunque ha mejorado en la última versión, sigo creyendo que su "usabilidad" no es de lo mejor.
- No dispone de Ingeniería reversa para PHP (si la sacan sería un GOL)
- No detecta la composición. No es una desventaja pero te dá más trabajo en crear atributos.


Bouml
BoUML fue una sorpresa después de haberlo testeado hace poco (y haberlo hecho hace 2 años veo su evolución), ahora ya tiene soporte TOTAL para PHP 5 y está orientado al programador. Está diseñado ,y te fuerza a usar la metodología RUP, por ejemplo no puedes crear un diagrama de clases en un "Use case View" donde solo se debe crear casos de uso. Es ligero, usa UML 2.0 y tiene íconos para los estereotipos. Interesante :)

La generación de código para PHP 5: Excelente *****
Tiene la capacidad de generar código PHP 5 y también seguir desarrollando paralelamente (no chanca el código), tiene un generador de métodos getter y setters (es lo mejor, me ahorro harto trabajo) e inclusive te genera código PHP5 en los métodos.

Viene con un aplicativo para la gestion de proyecto colaborativo y la gestión de cambios en los diagramas que creamos. (excelente aportación)
Tiene una opción de ingeniería reversa para PHP 5. Muy buena. (Con ésto hace este programa de los libres único por ahora)

Detecta la asociación de composición , crea un atributo en la clase cliente.

Desventajas:
- El código aún no dispone de una técnica para dar pertenencia de una clase a un paquete, pero tal vez halla un truco por allí (que no he logrado modificar) para generar con técnica de "nombres largos" de clase.
- No tiene un generador SQL para el modelo de datos.
- Increible, no encontré otra desventaja.. jeje
- Otra desventaja es que a pesar que se puede poner el estilo de documentacion de PHPdocumentor no detecta los returnValue o los parámetros de un método para generarlos en el comentario. Es posible digitarlos manualmente pero sería muy laborioso


Después hay otras herramientas como: umbrello (**) (su interfaz es básica y su generación de código también) y claro el Rational Rose (**)... que podemos decir que es el mejor en RUP y UML ... PERO....
para genera código PHP sólo conozco el PHP4Rose: genera sólo codigo PHP 4 y es pésimo.


CONCLUSIONES:

* Aplicaciones como Rational Rose para PHP está descartado (sin analizar el costo de licencias).
* ArgoUML es bueno pero se requiere capacitación y mucha RAM en tu PC.
* Ningúna herramienta Case propone aún los namespaces de PHP 5.3 ó PHP6 y eso que está a la vuelta de la esquina.

* A pesar de que aún utilizo ArgoUML, me empeñaré en seguir investigando el bouml que está demasiado interesante. Cuando bouml tenga la opción de cambiar el "formato de nombre de una clase" (o me digan como hacerlo) y disponga de la generación de un modelo de datos (SQL) estaremos frente a LA HERRAMIENTA case para PHP.

Aún para mis proyectos seguiré usando ArgoUML y en mis tiempos libres seguir investigando boUML.

Retomando el Blog PHP experto

Tengo que pedir disculpas a los lectores de mi blog, que increiblemente con mi ausencia de POSTs, mi contador a incrementado considerablemente de visitas, y les agradezco enormemente.

Para este retorno de revivir el blog crearé varias partes:

* Analisis y Diseño OO : UML y RUP con PHP.
* Arquitectura Orientada al Servicio SOA para PHP, BPEL y BPMN
* Patrones de Diseño, capas de abstracción y SPL.
* Frameworks (Zend Studio en especial).
* SIG libre con PHP-mapscript (continuaré con los tutoriales ya avanzados).
* Base de datos: PostgreSQL y PostGIS.
* PHP 5.3 y PHP 6.
* IDE's para PHP (Eclipse PDT y Netbeans, en especial).
* Cursos y conferencias de PHP.

También escribiré algunos artículos mezclando los conceptos de ingeniería de software y el SIG.
Te haz preguntado porqué los SIG usualmente no se diseña en UML o utilizan un patrón de arquitectura como el MVC. Porqué los frameworks de PHP para Mapscript son usados como plantillas y no como "frameworks".
Los WMS, WFS y WCS no es acaso una "arquitectura orientada al servicio" pero espacial, pero aún así no lo toman como son. (UNA ARQUITECTURA!!!)

Espero sea de su interés los temas que postee y gracias nuevamente por sus visitas.