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.
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 ().
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.
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.
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.
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.
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://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