Si lo que hemos visto hasta ahora puede haber dejado gratamente sorprendido al lector por la facilidad del uso de los programas existentes en GNOME, gracias a CORBA, el mundo de Bonobo es mucho m�s espectacular y gran parte del futuro del software libre, y su equiparaci�n al software cerrado, est� en la creaci�n y uso de componentes de la forma m�s sencilla y flexible posible.
Miguel de Icaza, lider del proyecto Bonobo, cuando buscaba que modelo de componentes a utilizar en GNOME, encontr� en OLE2 de Microsoft una especificaci�n documentada de un modelo de componentes como el que quer�a, por lo que decidi� adoptarlo dentro de GNOME. Miguel ha defendido est� arquitectura dentro de la comunidad del software libre con �xito, a pesar de estar realizada por Microsoft.
No deja de ser curiosa la combinaci�n de utilizar como "middleware" CORBA y como modelo de componentes OLE2. Recordemos que la plataforma de software distribuido de Microsoft tambi�n utiliza OLE2 como modelo de componentes, aunque como "middleware" utiliza COM, el principal competidor de CORBA.
La idea es que un desarrollador disponga entre sus herramientas de trabajo de una paleta de componentes lo m�s amplia posible, algo que ya es una realidad dentro de Visual Basic o en el mundo de Java con los beans.
Una vez que dispongamos de esos componentes, organizados por paletas de diferente funcionalidad, el desarrollador tan s�lo tendr� que crear de cero aquella funcionalidad que no encuentre en los componentes. De esta forma, las aplicaciones pasan a ser un grupo de componentes que colaboran entre s�. Y, �c�mo sabemos que nos ofrece un componente? Muchas veces esta informaci�n nos la da la documentaci�n, pero si dichos componentes tienen interfaces IDL, estas interfaces son la documentaci�n m�s exacta y �til para el desarrollador, aparte de ser independientes del lenguaje y plataforma de desarrollo. Y esta informaci�n puede ser utilizada por herramientas de generaci�n autom�tica de c�digo o para mostrar las funciones dentro de las propiedades de un componente.
Dentro de GNOME parece que el entorno de desarrollo basado en componentes va a ser GLADE, cuya interfaz gr�fica la podemos observar en la siguiente figura.

La idea es ir tomando estos componentes y de forma visual y construyendo la interfaz gr�fica de nuestra aplicaci�n. Una vez construida la interfaz gr�fica se genera el c�digo, que en muchos casos ser� compilar las interfaces IDL de los componentes y generar los cabos para que podamos acceder a la funcionalidad del componente desde nuestro programa. Este c�digo se podr� generar f�cilmente en diferentes lenguajes. S�lo hace falta que ORBit tenga un compilador al lenguaje deseado, ya que CORBA se encarga de que lo dem�s funciones. De esta forma, la herramienta de desarrollo no nos obliga a utilizar ning�n lenguaje y cada uno puede trabajar con el que se sienta m�s c�modo y sea m�s adecuado en su proyecto. En la actualidad a�n en GLADE no est� disponible esta funcionalidad, pero seguro que en los pr�ximos meses la veremos aparecer.
Este modelo de desarrollo es muy parecido al mundo de los componentes de Microsoft, donde los componentes al instalarse en el sistema se registran dentro del Registro del sistema (en GNOME es el GOAD) y desde las herramientas de desarrollo visuales, se pueden utilizar estos componentes, cuya interfaz se define en el IDL de Microsoft, muy similar al de CORBA.
Dentro de GLADE el aspecto que puede tener una interfaz gr�fica en desarrollo lo podemos observar en la figura 3.

�Desarrollo de componentes
Una de las ideas de los componentes es crear un entorno de trabajo centrado en los documentos. Cuando trabajas en un informe y necesitas insertar una hoja de c�lculo, el entorno nos da la posibilidad de introducir dentro de nuestro procesador de textos (un contenedor de componentes) una hoja de c�lculo, un componente, y utilizar todas las funcionalidades de la aplicaci�n de hoja de c�lculo dentro de nuestro procesador de textos. Un ejemplo de este modelo es como Word incluye hojas de c�lculo Excel.
De cara al usuario todo es transparente pero el hacer posible este modelo requiere de unas infraestruturas bastante potentes, que en GNOME las proporciona Bonobo.
Bonobo es un conjunto de interfaces CORBA (definidas en OMG/IDL) que definen lo que es un componente empotrable dentro de un contenedor (contenido) y lo que es un contenedor. Adem�s, Bonobo incluye una implementaci�n por defecto, en C, de estas interfaces para evitar al programador el trabajo de tener que escribir en cada nuevo componente o contenedor el mismo c�digo.
Todas las interfaces de CORBA heredan de GNOME::Unknown, una interfaz que nos permite preguntar a un componente cu�les son las interfaces que implementa y permite llevar cuentas de cuantas veces ha sido referenciado un componente para poder controlar el momento de su destrucci�n. Aqu� vemos la definici�n en IDL de dicha interfaz.
module GNOME {
interface Unknown {
void ref ();
void unref ();
Object query_interface (in string repoid);
};
};
Es muy importante que cada vez que obtengamos una referencia a un objeto Bonobo llamemos al m�todo ref de ese objeto. De esta forma la implementaci�n del objeto sabe cuantas veces ha sido referenciado, y hasta que este n�mero no llegue a cero, sabe que no se puede eliminar dicho objeto. Dentro de CORBA no hay ning�n mecanismo para llevar este control sobre el ciclo de vida de un objeto, por lo que hay que descargar en el programador esta responsabilidad. De igual modo, cuando no vayamos a utilizar m�s esta referencia, debemos de llamar al m�todo unref, que puede llegar a provocar la liberaci�n del objeto y que nuestra aplicaci�nn ocupe menos recursos.
Un objeto Bonobo puede implementar varias interfaces, y por lo tanto, puede ser visto de distintas formas dentro de las aplicaciones, dependiendo de por la interfaz por la que se acceda a �l. Cuando obtenemos una referencia a un objeto Bonobo a trav�s del m�todo query_interface podemos pasarle una interfaz. El objeto Bonobo, si la implementa, nos devolver� una referencia CORBA para poder acceder a la implementaci�n de dicha interfaz. En el caso de que no la implemente nos devuelve el objeto nulo. Veamos un peque�o ejemplo de su uso.
CORBA_Object obj_unknown;
CORBA_Object obj_embeddable;
obj_unknown = CosNaming_NameService_resolve (orb, "Word97", &ev);
obj_embeddable = GNOME_Unknown_query_interface
(obj_unknown, "IDL:GNOME/embeddable:1.0", &ev);
Lo primero que hacemos es acceder al servicio de nombrado y obtener el IOR del objeto cuyo nombre es "Word97". Como puede observar el lector, a esta funci�n se le pasa el objeto orb y se utiliza la variable ev para almacenar las posibles excepciones que puedan aparecer en esta llamada. El lector que quiera comprender en profundidad esta sintaxis puede acudir aqui donde se explica con bastante detalle la traducci�n de OMG/IDL a C.
Una vez que ya tenemos una referencia a un objeto Bonobo, invocamos sobre �l el m�todo query_interface para comprobar si implementa la interfaz IDL:GNOME/embeddable:1.0, es decir, si es un objeto empotrable en un contenedor. Si lo implementa, obtenemos una referencia a la implementaci�n de esta interfaz por el objeto y la podemos utilizar para controlar la inserci�n del objeto dentro del contenedor de nuestra aplicaci�n.
Uno de los usos m�s flexibles de esta interfaz Unknown es que permite que un objeto sea actualizado sin que afecte para nada a todos los clientes que ya exist�an de dicho objeto. Basta con mantener en el objeto las interfaces antiguas junto a las nuevas. De esta forma la actualizaci�n de objetos siempre asegura la compatibilidad hacia atr�s aunque eso s�, hay que tener cuidado de no acabar con interfaces enormes y poco manejables.
Dentro de Bonobo se ha hecho todo lo posible para evitar que el desarrollador tenga que aprender CORBA en profundidad, aunque los conocimientos b�sicos son necesarios para entender lo que estamos haciendo. Buscando esta facilidad se cre� el objeto GnomeObject, que est� basado en el objeto ra�z GTK, y que implementa por defecto la parte de funcionalidad de un componente Bonobo que es siempre muy parecida. Este objeto GnomeObject es b�sicamente un recubrimiento de un servant de POA al que se le une la implementaci�n de la interfaz Unknown. Recordar al lector que un servat en CORBA era el c�digo encargado de implementar una interfaz IDL, y que es un concepto perteneciente a POA, al adaptador de objetos portable de CORBA.
Hasta aqu� hemos llegado en esta presentaci�n del uso de CORBA pero en el siguiente apartado damos al lector algunas pistas de por d�nde continuar para profundizar en el desarrollo de aplicaciones GNOME.
�Por d�nde seguir
Debido a la extensi�n que nos llevar�a una descripci�n completa de un contenedor y un componente empotrable no podemos completarla en el presente art�culo, y quiz�s ser�a ya necesario dedicar una serie completa a este tema.
Si el lector se siente con ganas de seguir avanzando en el desarrollo de aplicaciones GNOME, conociendo las tripas del sistema, algo siempre recomendable, los pasos a seguir son leer los cap�tulos 7 y 8 del libro de GNOME y CORBA donde se explica c�mo se construye un componente embebible desde cero, y como se construye un contenedor.
Una vez que tengamos claro esto podemos pasar a ver c�mo se guarda el estado de una aplicaci�n que trabaja con componentes, tema delicado ya que hay que ir componente por componente guardando su estado, de tal forma que cuando arranquemos de nuevo la aplicaci�n y volvamos a la versi�n guardada del mismo, todo quede en el mismo estado en el que lo hab�amos dejado. Lo que se hace b�sicamente es definir unas interfaces para dar soporte de persistencia, es decir, que el objeto que implemente estas interfaces es capaz almacenar y recuperar su estado. Utilizando sobre todos los componentes que componente nuestra aplicaci�n esta interfaz, podemos almacenar el estado del conjunto de la aplicaci�n de una forma est�ndar.
�Conclusiones
El mundo del software libre estaba muy por detr�s del mundo de software cerrado en el mundo de los componentes. Esta distancia se ha acortado de forma espectacular con GNOME y su modelo de componentes Bonobo.
La combinaci�n de CORBA y OLE2 logr�n un entorno de desarrollo de componentes potente y sencillo, en el que el programador puede comprender y seguir todos los detalles de la arquitectura, y para el que no se necesitan complejas herramientas de desarrollo.
En el mundo del software libre se avecina una pr�xima revoluci�n, la de los componentes libres. En cuanto el conjunto de desarrolladores comprendan el modelo de desarrollo basado en componentes, y dispongan de las herramientas adecuadas, veremos surgir una gran variedad de paletas de componentes libres, que podremos utilizar para desarrollar nuestras aplicaciones de forma muy r�pida y robusta.
GNOME es un ejemplo pr�ctico del uso de CORBA muy completo e interesante, que puede servir al lector para profundizar en sus conocimientos de CORBA y aprender a desarrollar aplicaciones sencillas y potentes con muy pocas l�neas de c�digo.