5.- Código fuentes de las clases Antes de iniciar a relatar el código fuente de las clases, necesitarás descargar estos archivos. Por el momento están extendidos para Xailer ya que es con lo que estóy programando y realizando las pruebas. Al final de todos os artícuos 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 articula de las clases. Es general a todas las clases la próximo estructura: Variables de clase declaradas como PROTECTED:. Es conveniente realizarlo así para proteger el entrada directo a la variable desde afuera de la clase, si deseamos realizar cierta operación o comprobación de la variable desde su método set() nos aseguramos que se realice. Métodos set 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 os datos que queramos de la clase. Si no vamos a usarlo, definirlo y devolver una cadena vacía. toArray() : devuelve un array con os 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 os datos en la fundamento 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 vigilancia a las clases Factura y FacturaLinea (he ya que el nombre así para que salgan en orden las clases en el gestor de programas de Xailer). Como comenté anteriormente, las objetos tienen referencia a otros objetos, así en la clase Factura se referencian os objetos de las clases Cliente y FacturaLinea y en la clase FacturaLinea se referencia el objeto Artículo. En os 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 eludir 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 determinadoas lineas, por lo que para poder Guardar os objetos FacturaLinea() de cada una necesitaremos determinado mecanismo que lo haga. Para ello he creado la clase ArrayList() (ver documentación adjunta), que contiene una lista con todos os 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 particular 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 conseguir el total de la factura. Os métodos hasNext() y Next() estan explicados en la documentación adjunta. Explicar que esto es casi os 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 os objetos. He creado otra clase, Navigator(), que hereda de ListIterator(), que sirve para recorrer una lista de objetos usando eof() y skip(). Pero yo aconsejo 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: Probando la clase cliente Se puede contemplar el uso del método toString() para presentar información a través de un MsgInfo(): Detalle toString de la clase Cliente El código de prueba de la clase Artículo: Codigo de prueba de la clase articulo El uso de toString(): Detalle toString de la clase producto El código de prueba de la clase Factura: Codigo de prueba de la clase registra El método que agrega las lineas de registra a la clase Factura: Método que agrega las lineas de registra El 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 Así se presenta la salida del toString() de la clase Factura: Salida de la prueba de la clase Factura Podeis contemplar la potencia, verstilidad y claridad de código que se obtiene usando este método de trabajo. En el proximo producto 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).