Programación Orientada a Objeto avanzada con xHarbour y Xailer. (I)

1.- INTRODUCCION

(Te recomiendo leer este artículo primero ya que si no, corres el riesgo de no entender nada de lo que vendrá después).

Hace algunos meses, es posible que un año, Jose Giménez e Ignacio Ortiz me pidieron que escribiese un artículo para Xailer; en aquel momento tenía intención de desarrollar el tema de la programación MVC con Xailer, pero Jose me comentó que Ignacio también estaba preparando algo sobre el tema y que escribiese sobre otra cosa. Entre que no me venía la inspiración, los problemas personales y algún que otro ataque depresivo se me paso el tiempo sin escribir nada. Por fin, hoy, una idea no dejaba de darme vueltas en la cabeza, tanto que no me dejaba dormir, así que aquí estoy.

Allá por 1999, Manu Expósito me mostró algo en lo que estaba trabajando (TDBF se llamaba), era un sistema para poder usar la información contenida dentro de las tablas DBF como objetos; un sistema novedoso que, por aquel entonces, me llamo la atención sin llegar a despertar más interés en mis quehaceres diarios; lo vi, lo probe, algo me dijo dentro que a aquello le faltaba algo (no sabía que) y lo dejé aparcado pese a la insistencia de Manu de que lo usase que me cambiaría la forma de ver las cosas y me ahorraría mucho trabajo, pero como no terminaba de verlo, lo aparqué.

Con el andar del tiempo vino Harbour, xHarbour, Xailer, C3, la conexión con bases de datos ….  de nuevo Manu me llama para mostrarme Eagle 1, una forma de conectarse con MySQL de forma rápida y transparente sin usar ODBC ni ADO. ¡¡¡Ole por Manu!!! ¡¡¡Eso es algo que estaba yo esperando desde hacía tiempo!!! Por supuesto, con muchas, muchas, muchas mejoras, Eagle 1 se basaba en la filosofía de TDBF. Lo evalue, lo use en algún proyecto y volví a sentir que a aquello le faltaba algo, que era estupendo, genial, pero, no sabía por qué, no terminaba de convencerme del todo. Pensando que era la forma de separar las capas de clases de Manu me puse manos a la obra y desarrolle, basandome en los wrappers de C que hizo Manu para MySQL, mis propias clases (TQuery), que terminó siendo muy parecida a la de Manu. Y tampoco me sentía satisfecho del todo con aquel trabajo ¿por que? Por que sentía que a aquello tambien le faltaba “sustancia” de POO aunque entonces no lo sabía.

Con Xailer me pasaba lo mismo, una potente estructura de clases hacen que Xailer tenga en su interior un interesantísimo y potentísimo sistema de DataSources y DataSets que encapsulan gran parte del trabajo con datos; ya sea con DBF o con motores SQL. Pero como ya he dicho antes, subsconcientemente sentía que faltaba algo.

Como no era capaz de averiguar que era, yo, como buen usuario, me dedique a trabajar con mi clase TQuery y con los DataSet de Xailer, según conviniese al proyecto. Trabajando en Aseproda descubrí la programacion por patrones y el MVC; maravilla de la ingeniería del software, al principio no me enteraba de nada, me perdía por el código que se me antojaba enredado y lioso, hasta que lo comprendí bien: cada cosa en su sitio y un sitio para cada cosa: el MVC se me abrió en la mente como una revelación divina. Y me enamoré.

Como soy así (aunque a veces algo cabezón, pero por la razón y demostrando la utilidad de las cosas rápidamente se me convence) decidí extrapolar los conocimientos del MVC a mi programación diara. Lo primero, construir el modelo de datos, eso de que desde un mismo objeto se tenga acceso a sus objetos relacionados (o dicho de otra forma, que desde la factura acceda a las lineas y desde las lineas a los artículos y desde los artículos a las familias) se convertía para mí en la más grande de las comodidades. Puesto manos a la obra y con las herramientas que disponía programé varios sistemas de esa forma. Pero seguía teniendo la sensación de que faltaba algo.

He leido mucho sobre POO, hice cursos a distancia de Java, me compre libros de Java, pero, exceptuando cosas muy básicas, nunca hice nada serio con Java. Necesitaba un tutor, un maestro que me guiase, un curso presencial. Por fín, después de mucho buscar, conseguí hacerlo. Y, de nuevo, la luz vino a mi y me reveló que era eso que faltaba en los datasets.

En mis comienzos con Java siempre terminaba preguntandome ¿cómo se conecta la base de datos? ¿Dónde se definen los datasets? ¿Como recorro una colección de datos? Jamás de los jamases obtuve respuesta a esas preguntas por que …. sencillamente no había respuetas.

Es cierto, en Java, el lenguaje de POO por excelencia, la conexión a datos y los datos (de la base de datos, claro) son cosa secundaria. Java es POO, todo en java en un objeto, desde un tipo de dato a una ficha de cliente; todo en Java pertenece a una clase, no existen las funciones.

Así que después de descansar un día, decidí trasladar los conocimientos aprendidos de Java a Xailer, a ver si se podía trabajar de la misma forma, ya que para mi, la forma de trabajar de Java es la más cercana a la realidad. Así que manos a la obra, voy a empezar a crear mis clases (en Java se trabaja con objetos, os lo recuerdo, no con tablas de la base de datos) y bien … ¿Bien? ¡¡ANDA!! ¡¡Primer escollo!! ¿Cómo se trabaja con listas de objetos en Xailer? Claro, me he creado mi clase Factura, mi clase LineasdeFactura y dentro de Factura he de tener una lista de objetos de la clase LineasdeFactura. Y, amigos míos, ¡¡¡ahí ha sido donde me he dado cuenta de que era lo que echaba en falta el la programación con TQuery, Eagle 1 y Xailer!!! ¿Lo adivináis?

Muy sencillo, desde Eagle  1, TQuery y Xailer puedes crear un objeto Factura …. Un momento, un momento NOOOOO, no es un objeto Factura, ERROR, es un objeto del tipo (clase) DataSet_que_sea que contiene información sobre las facturas pero (y esto es importante) no es un objeto Factura.

Esto ya me ha hecho pararme y comerme el coco de tal manera que son las 4:00 de la madrugada y no puedo dormir pensando en estas cosas. Ya se me ha ocurrido como montar una clase que simule el ArrayList de Java en Xailer; como sobreescribir métodos de las clases del browse y de FastReport para compatibilizarlo con esto. Y, desde luego, como implementar MVC correctamente en Xailer (lamentandolo mucho, no se podrán usar los DataContrlos hasta que no estudie bien como asociarlo). Ahora me doy cuenta de la tremenda cohexión que existe dentro de Xailer a través los DataSets, todo gira a su alrededor  y depende mucho de ellos.

Este es el primer artículo, a modo de introducción, sobre POO avanzada con Xailer. Se que a algunos esta forma de programar les puede parecer un poco “anticuada” y “de escribir mucho código”, pero os puedo asegurar que es la mejor para trabajr con Patrones de Diseño y sobre todo con el patrón MVC.

Anuncios

8 comentarios

  1. José Alfonso,

    No utilizo ni DataSets ni DataControls en mis aplicaciones de Xailer, por el simple mero hecho de que “no me convence totalmente”. sigo con mis DBFs y mi estilo tradicional de Clipper, usando el entorno gráfico de Xailer, por lo que me interesa mucho el sistema que describes en este artículo y estaré a la expectativa de los posteriores artículos que hagas.
    Ánimos.

    Xevi.

    • Xevi,

      Estoy seguro que lo que voy a contar sobre POO avanzada con Xailer te va a gustar y te ayudará muco en tus aplicaciones. En breve publicará un nuevo articulo haciendo un repaso de POO y después de ese me meteré ya en materia.

      Tango pensado impartir seminarios sobre este tema (y algunos mas) a grupos reducidos de 10-15 personas.

      Un abrazo y gracias por el comentario.

  2. Alfonso,
    Gracias por esta introducción.
    Un fuerte abrazo
    Jose Lopez

  3. Me alegro de que estés por aquí de nuevo…

    Jajaja como siempre tengo pegas sobre el artículo introductorio…. 😉 ya sabes que soy el hombre de las pegas…

    De momento te voy a dejar y no las voy revelarrrrrr…

    Este año he terminado 1ª DAI de adultos (Desarrollo de Aplicaciones Informáticas) eso que te propuse también en algún momento… ya sabes ir a la universidad o hacer este curso de Formación profesional superior… todo esto viene a cuento de… adivina que lenguaje se usa?
    Exacto, Java y me ha gustado mucho… creo que te comenté algo.

    He ampliado mis conocimientos en POO para poder aplicarlos a (x)Harbour. Mi conclusión es que, hasta cierto nivel, cualquier cosa que se haga en Java se puede hacer en (x)Harbour…
    Clases abstractas e Interfaces. Gestión de errores y excepciones con TRY , CATCH, THROW y FINALLY. Serializacion etc.

    Y las clases relacionadas con el tratamiento de conexiones a bases de datos, tratamiento de conjuntos de datos con los RecordSet etc…
    También he visto diferentes patrones de programación no sólo MVC sino por ejemplo las factorias de objetos, singleton etc…

    Todo, todo me ha ayudado y estoy replanteando Eagle1, Condor1 y la propia y vieja Tdbf…

    Espero seguir leyéndote y poder ponerte pegas jaja…

    Gracias José A.

    PD. A ver cuando nos vemos…

    • Hola Manu,

      Pegas habrá muchas, tuyas y de más gente. Recuerda que es un artículo introductorio resumido y que ahondar más no es su objetivo.

      A mi me ha encantado Java, mucho. Me ha abierto nuevas posibilidades que se pueden llevar el mundo xHarbour y desde luego he visto con una claridad increible la POO.

      Gracias por el comentario, un abrazo y llamame para vernos.

  4. Interesantísimo, como siempre! Me llama a la reflexión tu afirmación sobre los ORMs. Es cierto, un Dataset o una Tdbf NO ES una factura, al menos no completa, le falta la capa de negocio, verdad? Eso es evidente en los ORMs que he visto para php, por ejemplo Doctrine, que usa el patrón ‘variaciones protegidas’, donde crea una clase que hace el mapeo objeto-relacional, y una clase vacía (sí, como las ‘T’ de Xailer) donde tu implementas las reglas de negocio, y llegado el caso, describes además las relaciones con otras tablas, por ejemplo que Factura contiene en una relación 1 a muchos 1 o más Lineas_de_Facturas. TDbf, TDataSets y demás nos hacen la primera capa, y está en nosotros implementar la segunda.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: