Programacion Orietada a Objeto avanzada con xHarbour y Xailer (V).

5.- Código fuentes de las clases.

Antes de empezar a comentar el código fuente de las clases, necesitarás descargar estos archivos. Por el momento están desarrollados para Xailer ya que es con lo que estóy programando y realizando las pruebas. Al final de todos los artículos dejaré enlace para descargar la librería para xHarbour.

Aqui puedes bajar el código fuente de las clases y de la prueba para Xailer.
Aqui puedes bajar documentación sobre las clases ArrayList, ListIterator y Navigator.
Aqui puedes bajar la libreria complements para xHarbour.

5.1 La estructura de las clases.

Es común a todas las clases la siguiente estructura:

  • Variables de clase declaradas como PROTECTED:. Es conveniente hacerlo así para proteger el acceso directo a la variable desde fuera de la clase, si queremos hacer alguna operación o comprobación de la variable desde su método set() nos aseguramos que se realice.
  • Métodos set() y get() de las variables de clase para poder asignar y recuperar su varlor.
  • Métodos contructores, new() debe estar siempre. El método Crear( parámetros) es opcional, aunque así ahorramos código, se puede llamar como cada uno prefiera.
  • Métodos especiales:
    • toString(): devuelve una cadena con los datos que queramos de la clase. Si no vamos a usarlo, definirlo y devolver una cadena vacía.
    • toArray(): devuelve un array con los datos que queramos de la clase. Si no vamos a usarlo, definirlo y devolver un array vacío.
    • Grabar(): lo estudiaremos más detenidamente. Sólo nos quedaremos que llamará a la capa de persistencia para grabar los datos en la base de datos. ¿Por qué la clase FacturaLineas no tiene un método grabar? Por que no lo necesita. Lo veremos con detalle cuando estudiemos la capa de persistencia.

Prestemos atención a las clases Factura y FacturaLinea (he puesto el nombre así para que salgan en orden las clases en el gestor de proyectos de Xailer). Como comenté anteriormente, las objetos tienen referencia a otros objetos, así en la clase Factura se referencian los objetos de las clases Cliente y FacturaLinea y en la clase FacturaLinea se referencia el objeto Artículo. En los métodos getCliente(), getLineas() y getArticulo() se comprueba si está vacía la variable de clase que contiene la referencia al objeto, devolviendo una instancia sin valores de la clase correspondiente para evitar errores.

El método getLineas() hace una cosa “rara”:

IF ::lineas == nil
::lineas := ArrayList():new()
::lineas:addNew( FacturaLinea():New() )
END IF

¿Qué es un ArrayList()? Las facturas contienen varias lineas, por lo que para poder almacenar los objetos FacturaLinea() de cada una necesitaremos algún mecanismo que lo haga. Para ello he creado la clase ArrayList() (ver documentación adjunta), que contiene una lista con todos los objetos FacturaLinea() de esta factura. La clase ArrayList() está dentro de la libreria complements.lib que tambien adjunto. Usar un ArrayList() es muy sencillo, ya que la propia clase incluye métodos para su uso.

Espera, Alfonso, que en el método getTotalFactura() tambien veo algo nuevo:

METHOD getTotalFactura() CLASS Factura

local totalFactura := 0
local it := ::getLineas():ListIterator()
local linea

WHILE it:hasNext()
linea := it:Next()
totalFactura := totalFactura + linea:getImporte()
END DO

RETURN totalFactura

¿Qué es un ListIterator()? ListIterator es un método de la clase ArrayList que retorna un objeto de la clase ListIteraror() que sirve para recorrer listas de objetos creadas con ArrayList(). En este caso se recorre la lista para obtener el total de la factura. Los métodos hasNext() y Next() estan explicados en la documentación adjunta. Aclarar que esto es casi los mismo que recorrer un dataset hasta eof() haciendo skip(), pero eof() y skip() son palabras de xBase que se relacionan más con las tablas que con los objetos. He creado otra clase, Navigator(), que hereda de ListIterator(), que sirve para recorrer una lista de objetos usando eof() y skip(). Pero yo recomiendo usar ListIterator.

5.2 Probando las clases.

En el código fuente adjunto hay un fichero que contiene un formulario, Ejemplo_01, donde he hecho pruebas con las clases creadas. Así, por ejemplo, para crear cualquier objeto, podemos usar dos formas, se puede ver en este ejemplo:

Codigo prueba clase cliente

Probando la clase cliente

Se puede observar el uso del método toString() para mostrar información a través de un MsgInfo():

Detalle toString de la clase Cliente

Detalle toString de la clase Cliente

El código de prueba de la clase Artículo:

Codigo prueba de la clase articulo

Codigo de prueba de la clase articulo

El uso de toString():

Detalle toString de la clase artículo

Detalle toString de la clase artículo

El código de prueba de la clase Factura:

Codigo de prueba de la clase factura

Codigo de prueba de la clase factura

El método que añade las lineas de factura a la clase Factura:

Método que añade las lineas de factura

Método que añade las lineas de factura

El toString() de la clase FacturaLinea:

Detalle del metodo toString de la clase FacturaLinea

Detalle del metodo toString de la clase FacturaLinea

El toString() de la clase Factura:

Detalle del método toString de la clase Factura

Detalle del método toString de la clase Factura

Así se muestra la salida del toString() de la clase Factura:

Salida de la prueba de la clase Factura

Salida de la prueba de la clase Factura

Podeis observar la potencia, verstilidad y claridad de código que se obtiene usando este método de trabajo.

En el proximo artículo veremos como usar las clases desde formularios e introduciremos dos nuevos conceptos: la vista (el formulario) y el controlador (lo que une al formulario con las clases del modelo).

Anuncios

20 comentarios

  1. Hola José Alfonso…
    Bueno ya estoy por aquí otra vez…

    Está muy bien el curso y le valdrá a mucha gente… jaja como dice alguien en un comentario, ya estoy harto de ver en los cursos de POO el típico árbol de herencia de la clase animales o vehículos… jaja.

    Hay algo muy importante en la POO y es que los objetos no son independientes los unos de los otros en el sentido de que todos ellos están integrados en un escenario en el que interactúan, produciendo eventos.
    Por lo tanto hay lo que se llama una RELACION. Básicamente esa relación puede ser:
    – Herencia, cuando un objeto se dice que “es un” lo que sea. Por ejemplo, un botón es un control visual. Esto quiere decir que la clase botón está heredada de la clase control visual. De aquí surge dos conceptos importantes en la POO, la especialización y la generalización dependiendo hacia donde miremos el árbol de herencia. El primero sería de arriba a bajo o sea, de la clase madre control visual a botón, se podría decir que un botón es un control visual especializado en ser presionado y ejecutar un método que responde al mensaje click, por lo demás se habrán heredado todos los métodos y atributos de las clases superiores. Pero si lo vemos al revés, podríamos decir que la clase generalizada de un botón es el control visual en el que se guardan todos los método y atributos comunes a TODOS los controles visuales y no solo a los botones si no que también será lo común de campos de edición, cajas de chequeo, cajas de listas etc
    – Composición, cuando un objeto A tiene otros objetos B. El objeto conoce la existencia de los B pero los B no tienen porqué conocer la existencia de A. Los objetos B serán creados al crear el objeto A y serán destruidos cuando se destruye el objeto A.
    -Agregación. un objeto envía mensajes a otros objetos ya creados y la destrución de un objeto A no implica lo mismo en B.

    Si pensamos en POO se podría decir que realmente una Factura no sería una clase si no el resultado de la relación de dos objetos básicos, cliente y productos. Claro que en (x)Harbour hay que crear una clase para las Facturas… igual ocurre con las Nóminas que al fin y al cabo es la relación entre un trabajador y un puesto de trabajo…

    En Java no sólo los atributos o datas se escriben en minúscula si no que también lo hacen los métodos, de hecho siguen las mismas reglas. Sólo el método constructor se empieza en mayúscula. O sea el método que tiene el mismo nombre que la clase.

    Por otro lado el método especial toString() no debería ser llamado directamente, en Java se llama automáticamente por los métodos de los flujos de salida por ejemplo .print(), ejemplo
    System.out.println( obj ).

    Los iteradores pueden ser creados desde cualquier clase de tipo colección.

    Y por último, por ahora, los DataSet y TDbf no son objetos Facturas sino una clase que encapsula el manejo de tablas con registros donde se guarda la información ordenada que se desee.
    Otra relación que se me ha pasado es la delegación. Por ejemplo el método guardar() de la clase facturas seguramente delegará esa acción en un objeto TDbf, concretamente en su método save().

    Menudo ladrillazo me ha salido…!!!

    Bueno no os aburro más, por que lo bueno de esto de la POO cada programador tiene sus descripciones particulares.

    • Hola Manu,

      Gracias por el comentario y por adelantarte a las cosas que tenía previsto explicar más adelante. Soy más de empezar por conceptos básicos y sus ejemplos en vez de soltar un ladrillo teorico que termina abarrotando la cabeza con definiciones que aburren más que enseñan.

      Aclarar dos cosas:
      1.- Esto no es un curso de Java. Aunque esté usando cosas de Java y aplicandolas aqui.
      2.- Aqui sólo hay una clase ArrayList que usa un iterador. Lo demás que hay aqui (colecciones tipo datasets) no usan iteradores. y La clase ListIterator que he creado es independiente, por lo que puede ser instanciada desde cualquer colección que se desee.

      Cuando explique como funciona la capa de persistencia, veremos que hace el método Guardar().

      Un abrazo.

  2. Uff… perdón!!!

    Para nada quería adelantarme, espero no haber fastidiado na de na…

    Me parece un gran trabajo el que estás haciendo y te animo a seguirrrrr

    Saludos JA y lo dicho espero verte pronto y charlar un rato.

    PD: Mándame tu número de telefono…

  3. MAGNIFICO TRABAJO
    ESTO ME AYUDA A ENTENDER MEJOR LA PROGRAMACION POO CON XAILER Y PODRE TRABAJAR MEJOR EN MIS PROYECTOS
    MUCHAS GRACIAS POR LA APORTACION

  4. que tal esta bien como se explica ya que algunos estamos adentrandonos en el mundo de Xailer y xHarbour.

  5. Alfonso
    gracias por compartir tan valisosos conocimientos!
    Pregunto si exite una lib complements para xharbour + fwh

    Saludos
    Mario Gonzalez

  6. Caro Alfonso,

    Não consegui baixar os arquivos… Os links estão quebrados…

  7. Hola, buenas noches Sr. J.Alfonso….

    Estoy leyendo su blog sobre POO xHarbour+Xailer…. Sé que tiene algún tiempo que usted terminó de crearlo. Pero en mi caso, me interesa mucho lo que explica y me gustaría implementarlo en un pequeño sistema que tengo planeado crear.

    Quiero preguntarle de forma directa, ¿todavía tiene disponible la librería complements.lib que menciona en este artículo? Me interesa.

    Saludos.

    • Hola Juan,
      complements.lib está publicada en la página de descargas de Xailer. Yo la uso constantemente.

      Está actualizada a la version 3.0 de Xailer, si usas una versión superior comunícamelo para poder prepararla.

      Saludos.

      • Buenas tardes Sr. J. Alfonso

        Gracias por el dato y por su apreciable disposición. No uso Xailer, sino (x)Harbour + ooHG. Intenté descargar los archivos del principio de este capítulo V, pero ya no funcionan. Mi idea era poder adaptarla a xHb+ooHG y dar uso a la librería.

        Su aportación para el lenguaje es apreciado de mi parte.

        Pase buenas tardes….

      • Enlaces arreglados.

  8. Good morning Sr. J. Alfonso.

    I know it’s been a long time since you published it, but I’m starting to use Xailer and this article has been very helpful. Unfortunately, the download links are broken.
    I’m having some difficulty in finding basic, specific material for xailer.
    Can you fix the links, or send me some tips?

    Thank you!

  9. Good morning Sr. J. Alfonso.

    I know it’s been a long time since you published it, but I’m starting to use Xailer and this article has been very helpful. Unfortunately, the download links are broken.
    I am having some difficulty in finding basic, specific material for xailer.
    Can you fix the links, or send me some tips about “Class creation” and “Inheritance” ?

    Thank you!

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: