FoxPress – Marzo 2001

 

VCOM: componentes modulares para VFP

http://www.fpress.com/

 

Por Antonio Romero





Uno de los problemas más habituales en el desarrollo de aplicaciones es la creación de ejecutables monolíticos, que ocupan un tamaño considerable y donde están compilados todos los elementos de una aplicación, como puedan ser programas, clases, reports, imagenes y otros elementos. Este tipo de distribución presenta varios inconvenientes, tanto desde el punto de vista práctico, ya que una pequeña modificación en un programa implica una recompilación de todo el proyecto, cómo desde el punto de vista teórico, o sea la separación de una aplicación en compontes más sencillos.

 

 Una primera solución pueden ser el recompilar las clases, programas, etc individualmente, pero esto significa un trabajo extra en la coordinación, ya que la mayoría de las veces una determinada funcionalidad no las da exclusivamente un programa, sino un conjunto de programas, clases e informes.

 

             La idea en que se basa VCOM es la creación de módulos que integren toda la funcionalidad necesaria en un único componente, incluyendo el interface de usuario; encapsulando toda la funcionalidad bajo una interface que es la que se muestra al resto de la aplicación. VCOM se encarga de gestionar los componentes de la aplicación, carga y descarga de estos; así como la creación del interface común a todos los componentes.

 

 

   Problemática

 

 Supongamos que tenemos una aplicación, por ejemplo de facturación, que usan diez de nuestros clientes y esta aplicación lleva funcionando ya cierto tiempo. Hemos decido mejorar la parte de gestión de almacén y comenzamos a tocar los diversos programas que componen esta parte; en esto que nos llama un cliente para comunicarnos que hay una parte de la emisión de facturas que falla y desea una solución rápida, como siempre en estos casos. Ante esto nos vemos en la siguiente disyuntiva, si solucionamos el problema del cliente, al recompilar resulta que estaremos enviandole  la parte de gestión de almacén que estamos mejorando y todavía no hemos probado lo suficiente, con lo cual podemos dar lugar a otros problemas, y si por otra parte esperamos a tener todo terminado, el cliente protestará por la espera y nosotros tendremos que sufrir el estrés que provoca trabajar contra reloj debido a un imprevisto con el que no contábamos.

 

             Con VCOM tendremos un componente FACTURAS.EXE y otro ALMACEN.EXE, de esta forma compilaremos sólo la parte de FACTURAS y esto es lo que enviaremos al cliente para solucionar el problema, cuando tengamos acabado y probado el módulo de ALMACEN entoces lo distribuiremos.

 

             Profundizando más en el tema, a todos nos sucede que tenemos programas, clases, etc ... compartidos entre todas nuestras aplicaciones, por ejemplo la gestión de usuarios, esto da lugar a que una modicación en esta nos obligue a recompilar todas nuestras aplicaciones y enviarlas a todos nuestros clientes.

 

             En VCOM podemos tener un componente llamado LOGIN.EXE, que es el que se encarga de todo lo relacionado con la autentificación de los usuarios, control, etc, este componente es utilizado por todas las aplicaciones pero no está incluido en el .EXE principal. Si encontramos un error basta con recompilar el componente, y enviarlo a los clientes; de esta forma nos ahorramos recompilar todas las aplicaciones.

 

             Otro tema que se nos plantea son las pequeñas diferencias que hay entre el mismo módulo de diversos clientes, por ejemplo en el formato de las facturas, por ejemplo un bar-restaurante puede tener dos formatos: el ticket típico de caja registradora que es el que se utiliza en la barra del bar o la factura que se utiliza en el restaurante, con la consiguiente complejidad añadida a la lógica del programa. Con VCOM podemos tener dos componentes llamados IMPRIMIR.EXE, pero que hacen cosas diferentes, bastará con que copiemos en cada PC el IMPRIMIR.EXE que nos interese.

 

 

A fondo

 

 El gestor de componentes se basa en lo que denominamos servidor de componentes o VCOM Server, que reside en un ejecutable llamado VCOM.EXE. Este módulo es el que contiene todos los métodos necesarios para operar con los componentes, como pueden ser la carga o descarga dinámica de un componente; la instanciación de objetos, gestión de los módulos Manager de los diversos componentes, etc; y hemos de inicializarlo al principio de nuestra aplicación.

 

 Cada uno de los componentes puede estar compuesto por todos los programas, clases e informes que deseemos, a partir de estos crearmos un proyecto, añadiendo un programa llamado VCOMClient.prg que es el que da la uniformidad a todos los componentes, este pequeño programa contiene los datos del componente, como puedan ser la clase en que se basa, el nombre del componente, etc ...; a partir de esto compilaremos el proyecto de forma tradicional y crearemos un .EXE o .APP con el componente

 

             Los componentes .EXE se cargan automáticamente al inicializar VCOM Server, y los componentes .APP los hemos de cargar en el momento que lo necesitemos.

 

             Cada componente es instanciado de forma estática como un miembro del objeto VCOM, de esta forma no es necesario crear un objeto cada vez que necesitamos acceder a los métodos o propiedades de la clase, así si por ejemplo tenemos la típica pantalla con un termómetro de progreso, no necesitamos efectuar un createobject cada vez que la necesitemos, suponiendo que el componente se llama PROGRESS bastará con invocarlo de la siguiente forma .:

 

       VCOM.Progress.setMensaje ('Mensaje de prueba ')
    VCOM.Progress.Show ()
    VCOM.Progress.Update (10)
    VCOM.Progress.Hide()

 

             Aunque también tenemos la posibilidad de instanciar objetos a partir de un componente concreto, a través del método VCOM.CreateObject ().

 

 

En la práctica

 

 Un ejemplo de aplicación creada con componentes tendría el siguiente aspecto .:

 

 

* -----------------------------------------------------------------------------

*

*    Programa .: SAMPLE.PRG

*   Finalidad .: Programa principal de una aplicacion VCOM

*       Autor .: Antonio Romero

*                                                                  05/01/2001

* -----------------------------------------------------------------------------

 

    VCOM ()                          && Inicializa Servidor VCOM

    VCOM.Load ('PUBLICAPI.EXE')      && Componente con varias librerias públicas

 

 

    *   VCOM.PublicAPI.FirstInstance ()

    *

    *        Esta sentencia comprueba que solo este corriendo una copia de la

    *       aplicacion pero solo se aplica esta restriccion si no se esta en modo

    *       interactivo, que lo indica _VFP.StartMode = 0

 

    if (_VFP.StartMode = 0 .or. VCOM.publicAPI.FirstInstance ())

 

        * --->  Se inicializan el servidor VCOM para la carga automática de todos

        *       los componentes .EXE

 

 

        VCOM.Start ()

        VCOM.Load ('SPLASH.APP')             && Carga del componente Splash.app

 

 

        * --->  Incialización del componente .APP y de la aplicación

 

        VCOM.APP.SetcAppName ('MULIBS')

        VCOM.APP.cAbout = ' Utilidades para la admistraci¢n de aplicaciones FOXPro.'

        VCOM.APP.Start ()

        VCOM.Unload ('SPLASH')               && Descarga del componente Splash.app

 

 

        if VCOM.USER.Login ()                && Control de acceso a los usuarios

            VCOM.USER.addAccess ('INICIO')

            do form SAMPLE name frmMainApp

            read events

            VCOM.USER.addAccess ('FINALIZAR')

        endif

 

        VCOM.APP.Exit ()

 

    endif

 

    VCOM.Stop ()                             && Descarga de VCOM Server

 

  return

 

 En este ejemplo tenemos varios componentes, para cada uno tenemos un .EXE o .APP para el cual hemos creado un proyecto con todo lo necesario, así probablemente el componente SPLASH constará sólo de un formulario, pero en cambio el componente USER puede constar de varios formularios (login, cambiar contraseña ...) y alguna que otra clase que interactue con la base de datos.

 

             SPLASH.APP                         Muestra una pantalla del tipo SPLASH

             USER.EXE                                  Gestion de usuarios

   APP.EXE                              Control de la aplicacion

   PUBLICAPI.EXE Rutinas y librerias públicas.

             SAMPLE.EXE                         Aplicación principal

 

 En el ejemplo anterior tenemos 5 proyectos (APP/EXE), si encontramos un error o queremos ampliar por ejemplo la gestión de usuarios únicamente compilaremos y distribuiremos USER.EXE, sin necesidad de tocar lo más mínimo el resto de componentes o la aplicación principal.

 

 

Test y depuración de componentes

 

 Otra de las ventajas es que VCOM está diseñado para poder hacer un desarrollo iterativo e incremental de forma sencilla, permitiendo una depuración por separado de cada componente, así podemos efectuar los siguientes pasos desde la línea de comandos de VFP.

 

 

1. Inicializar el servidor de componentes                                               do VCOM.exe

2. Cargar el componente que estamos probando                    VCOM.Load (cComponentName)

3. Probar desde la línea de comandos los diversos métodos y propiedades

 

                            VCOM.<componentName>.Metodo ()
           VCOM.<componentName>.Propiedad

 

4. Descargar el componente                                                 VCOM.Unload (cComponentName)

5. Modificar lo necesario, compilar de nuevo el proyecto y volver al paso dos.

De esta forma podemos probar cada uno de los componentes individualmente, sin necesidad de intergrarlo en toda la aplicación, ni recompilar todo un proyecto más grande.

          

 

Otras Alternativas

 

 Otra alternativa para resolvernos alguno de los problemas planteados inicialmente es la utilización de los objetos COM que nos proporciona Microsoft, pero esto significa que hemos de seguir el modelo de tres capas estrictamente, o sea desde la capa de acceso a datos no tenemos acceso a interface de usuario, así para el caso la gestión de facturas no podemos incluir en el mismo componente la introducción de datos, su procesamiento y la impresión de facturas. En cambio este modelo es el adecuado si queremos que nuestra aplicación pueda correr a la vez en Internet y en un cliente tradicional, pero en la mayoría de los casos lo que realmente tenemos son los típicos clientes windows.

 

 El modelo de componentes COM también presenta el incoveniente de que está pensado para plataforma MS, con lo que nuestro desarrollo pàra internet sólo funciona si el servidor internet es de plataforma windows.

 

 Otro problema que se plantea el sistema de Microsoft es que hemos de registrar todos los componentes en todas las máquinas, así tenemos una red de 20 pc, hemos de registrarlo en todos ellos,  esto también se produce si creamos un nuevo componente.

 

 

Conclusión

 

 Una vez puesto en marcha e implementado VCOM se pueden constatar varias mejoras, como puede ser en la productividad, por ejemplo en un equipo de desarrollo cada programador se puede encargar de un componente VCOM en concreto, y bastará que publique la interface al resto de programadores; también se mejora la fiabilidad de las aplicaciones, ya que sabemos que código de un componente está totalmente separado de otros. También hace más sencillo la distribución de aplicaciones tal como se ha comentado al principio y por último está enfocado a facilitar los o mantenimientos adaptativos, correctivos, perfectivos y preventivos, resumiendo: facilitar el mantenimiento de aplicaciones.

 

 

Referencias

 

VCOM es freeware y tanto el servidor VCOM, con una documentación mucho más profunda con ayudas, diagramas UML y desarrollo de un ejemplo completo, así como varios ejemplos con código fuente lo podeis bajar de mi web en cualquiera de las siguientes direcciones.

 

  http://www.gaviero.com

  http://gaviero.freeservers.com

 

También quisiera mencionar el gestor de componentes VCL, desarrollado por Victor Espina, y cuya finalidad es la misma aunque difiere en algunos métodos con VCOM, hemos colaborado para que tanto ambos servidores VCOM/VCL como sus componentes sean compatibles, podeis ver más información sobre VCL en http://www.mitrompo.com/vespina.



 

 

FoxPress – Marzo de 2001

© 2001 FoxPress. All rights reserved