miércoles, abril 05, 2006

El patrón de diseño singleton

Bueno antes de empezar a hablar como perico acerca de este patrón de diseño déjenme les doy el significado de singleton sacado de wilipedia (le enciclopedia del pobre).

“Generally, a singleton is something which exists alone in some way”

Para los que solo hablan perro ahí les va la traducción al español
“generalmente un singleton es algo que existe solo de cierta manera”

Ahora vamos a definir lo que es un patrón de diseño
a design pattern is a general repeatable solution to a commonly-occurring
problem
En perro
un patrón de diseño es una solución representada de manera generar para un
problema recurrente
Ok entonces juntando las dos definiciones tenemos que un patrón de diseño singleton es la manera en la cual podemos restringir la creación de una clase a uno o solo algunos objetos.
Pero que chingados quiere decir eso, bueno esto quiere decir que es una manera en la cual yo voy a diseñar mi clase para que solo se pueda crear una instancia de la misma o dicho de otro modo es la manera en la cual una clase solo puede crear un objeto.

Ya le van agarrando, bueno ya se que algunos de ustedes se están haciendo la siguiente pregunta --para que chingados quiero yo un madre de estas, de que me sirve que una clase tenga una instancia solamente. Para contestar la pregunta imaginemos esta situación,

Ustedes están a cargo de desarrollar el modulo de contabilidad de un programa administrativo el cual cuanta con una arquitectura de tres capas. La capa de usuario reside en la PC del usuario, los objetos del negocio residen en un servidor central el cual para acabarla de joder esta en la china o algún otro lugar bien lejos del usuario. Y la capa de datos esta en un servidor juntito a la base de datos. Ok tu como desarrollador necesitas validar ciertas reglas de negocio, para hacer esto necesitas crear un objeto de una clase llamada bisRuleEngine la cual como parte de su comportamiento carga todas las reglas de negocio en una colección interna.

Suponiendo que tu quieres usar ese objeto, lo que tendrías que hacer al cargar la forma seria algo como esto

rules = new bisRuleEngine ( );

y donde necesites evaluar la regla de negocio usarías algo así

if (rules.eval (“ruel0001”) == true ) {
…….
}


Pero o sorpresa el triste objeto cada ves que lo instancias se tiene que serializar desde el servidor en donde reside la clase con todo el montón de reglas de negocio (asumamos que el guey que lo diseño era un pendejo y que diseño el motor de reglas para que cargara TODAS la reglas de una base de datos,, que para dramatizar nuestro ejemplo son como 5000).
Ahora supongamos que tu desarrollo abarca varias pantallas las cuales están en diferentes dlls, jars, o cualquier otro tipo de librería que gustes y mandes, te imaginas que lentitud seria que cada vez que el usuario abra una pantalla, esta cree un objeto de reglas de negocio y que al hacer esto se tenga que serializar desde el servidor en china, y para colmo la serializada es en XML y tu triste usuario cuenta con una conexión daill up de 56k.. A mi me han mentado la madre por menos que eso.

Ahora ya vez la utilidad del patrón de diseño singleton, en teoría la instanciada solo se haría una vez y después esa instancia se podría reutilizar a lo largo de la vida de la aplicación. Y digo en teoria porque estas a la merced del alcnce de vida del objeto, aquí se tendria que implementar un diseño para que nos permitiera compartir los objetos entre formas o algo así, pero eso es arquitectura.

Ok suena chido pero como se le hace para implementar este patron de diseño? Bueno primero que nada necesitamos un lenguaje que soporte características orientadas a objetos. Y cual lenguaje creen ustedes que seleccione para mi ejemplo? brujos!!!! PHP.


  1. Para la implementación de este patrón de diseño vamos a seguir los siguientes pasos.
  2. Necesitamos descara una variable estática que contendrá la instancia de mi clase
    Hacemos el constructor la clase privado para prevenir que la clase se instancie directamente, o sea utilizando la palabra reservada new.
  3. Creamos un método publico con cualquier nombre (a mi me gusta usar getInstance porque se oye chingon y hasta parece que se lo que estoy haciendo) este método va a ser responsable de crear la instancia de la clase o de regresar la instancia existente.
    En lugar de crear la instancia con la palabra reservada new se crea con el método getInstance ya que si se utiliza new falla porque el constructor es privado.

    Y pues aquí esta el código

    class bisRuleEngine {
    // Necesitamos descara una variable estática que contendrá la instancia de mi clase
    private static $instance;
    private $messageText;

    // Hacemos el constructor la clase privado para prevenir que la clase se instancie directamente, o sea utilizando la palabra reservada new.

    private function __construct ( ) {
    }

    // Creamos un método publico con cualquier nombre
    public function getInstance ( ) {
    if ( self::$instance == NULL ) {
    self::$instance = new bisRuleEngine ( );
    }

    return self::$instance;
    }

    // metodos de prueba para demostrar que sigo usando la misma instancia
    public function Evaluate ( ruleNo ) {
    return true;
    }

    public function setMessageText ( $value ) {
    $this->messageText = $value;
    }

    public function getMessageText ( ) {
    return $this->messageText;
    }

    function Show ( $msgId ) {
    if ( $msgId == 1 ) {
    echo "Mensaje informativo 1 \n";
    }
    else if ( $msgId == 2 ) {
    echo "Mensaje de error 2 \n";
    }
    }

    }



    Eso es todo por el momento nos vemos luego, cuídense y no coman tierra.

    Saludos.

PHP para Eclipse

Hace tiempo estaba con un grupo de amigos echándonos unas "chelas" (cervezas) en la casa de uno de ellos y como yo me junto con puro bato cura y medio geek y pues ya saben estábamos enfrascados en una conversación acalorada acerca de que ambiente de desarrollo integrado era mejor para el desarrollo de java. En aquel entonces yo solo conocía 2 IDEs uno era el Borlan JBuilder y el otro era un IDE medio chafa de Symantec, creo que se llamaba Symantec Café o algo así (no recuerdo el nombre porque el editor estaba bien pinche y no me gusto) otros decían que el JDeveloper, otros decían que el ultraedit 32 y en fin una serie de editores y de IDEs que ayudaban al desarrollador a programar y a ser productivo en Java, el único editor que nos falto mencionar fue el notepad ( me cae que nadie menciono el notepad por miedo a que le llovieran potazos y mentadas de madre hehehe). Bueno para hace el cuento corto que de repente empieza a ladrar un guey amigo de un camarada, este guey estaba en un rincón el hizo mención de un IDE grapa (o sea gratis) este IDE se llamaba Eclipse, lo describió como la octava maravilla del mundo que era lo mejor después del agua hervida y de la del condón y madres de esas.

Pues ni tardo ni perezoso al día siguiente (por la tarde porque la cruda me pego gacho) me puse a investigar ese pinche editor y que va siendo mi sorpresa que aquel carbón tenia la razón es un IDE muy chingón y desde entonces lo utilizo para los programitas de Java, luego hace 4 meses me entre que el JDeveloper de Oracle esta basado en eclipse.

Bueno esta choro mareador lo conté porque Enrique Place mi mando un cometario en la entrada del 16 de febrero en donde hablo del tipo de ambiente de desarrollo que utilizo para programar aplicaciones en PHP.

Bueno el menciona que existe un plugin de PHP para eclipse. Hoy lo baje y lo instale, y ya estuve jugando un rato con el (con el eclipse no sean malpensados) y bueno el eclipse para java esta chingón y con el plugin de PHP esta de poca madre, bueno lo poco que lo he usado, pero de echo en tan solo 2 horas y media ya desbanco al PHP DESIGER 2006 y que conste que no estoy diciendo que no usen el PHP DESIGNER, pero neta que el eclipse esta chingón.

Gracias Enrique por el tip.

Esta es la página del proyecto del eclipse
Esta es la página del plugin de PHP para eclipse

Bueno ya con esta me despido y ya me voy porque ya es tarde y ya tengo sueño. Hasta pronto y no coman tierra.

Saludos.