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

4.- El Proyecto

Vamos a construir un sencillo proyecto para ilustrar la forma de trabajar con este sistema basado en Objetos. Recordemos que en este modo de trabajo construiremos un modelo basado en objetos, para ello, aunque es algo difícil por el hábito adquirido, dejaremos de pensar en bases de datos y tablas. Realmente, aunque parezca increible, podemos olvidarnos de la base de datos, por el momento.

Nuestro proyecto va a ser una sencilla facturación con registro de clientes, artículos y facturas.

4.1 Clases de nuestro proyecto

Las clases necesarias para este proyecto son (usaremos como convención los nombre de clases en singular y la primera letra mayúscula):

  • Cliente. Contiene información de un cliente.
  • Articulo. Contiene información de un artículo.
  • Factura. Contiene información de una factura.
  • LineaFactura. Contiene información de una linea de factura.

Desarrollaremos cada una de las clases y posteriormente escribiremos su código:

Clase Cliente:

  • Variables: (en minísculas siempre, excepto cuando se compongan de mas de una plabra).
    • id
    • nombre
    • domicilio
    • codigoPostal
    • localidad
    • provincia
    • telefono
    • email
    • nif
  • Métodos: (primera letra mayúscula excepto los get, los set y los métodos especiales.)
    • New() (método constructor)
    • Grabar() (método para grabar los datos)
    • getId(), setId()
    • getNombre(), setNombre()
    • getDomicilio(), setDomicilio()
    • getCodigoPostal(), setCodigoPostal()
    • getLocalidad(), setLocalidad()
    • getProvincia(), setProvincia()
    • getTelefono(), setTelefono()
    • getEMail(), setEMail()
    • getNif(), setNif()
    • toString() (método especial que devuelve información en forma de cadena)
    • toArray() (método especial que devuelve informacion en forma de array)

Clase Articulo:

  • Variables:
    • id
    • codigo
    • descripcion
    • precio
  • Métodos:
    • New() (método constructor)
    • Grabar() (método para grabar los datos)
    • getId(), setId()
    • getCodigo(), setCodigo()
    • getDescripcion(), setDescripcion()
    • getPrecio(), setPrecio()
    • toString() (método especial que devuelve información en forma de cadena)
    • toArray() (método especial que devuelve informacion en forma de array)

Clase Factura:

  • Variables:
    • id
    • numero
    • fecha
    • objetoCliente (referencia al objeto cliente en vez de al id de cliente.)
    • objetoListaLineaFactura (referencia a un objeto lista que contendrá referencias a objetos linea de factura.
  • Métodos:
    • New() (método constructor)
    • Grabar() (método para grabar los datos)
    • getTotalFactura()
    • getId(), setId()
    • getNumero(), setNumero()
    • getFecha(), setFecha()
    • getObjetoCliente(), setObjetoCliente()
    • getObjetoLineaFactura(), setObjetoLineaFactura()
    • toString() (método especial que devuelve información en forma de cadena)
    • toArray() (método especial que devuelve informacion en forma de array)

Clase LineaFactura:

  • Variables:
    • id
    • linea
    • objetoArticulo (referencia al objeto artículo en vez de al id de artículo.)
    • cantidad
    • precio
  • Métodos:
    • New() (método constructor)
    • getImporte()
    • getId(), setId()
    • getLinea(), setLinea()
    • getObjetoArticulo(), setObjetoArticulo()
    • getCantidad(), setCantidad()
    • getPrecio(), setPrecio()
    • toString() (método especial que devuelve información en forma de cadena)
    • toArray() (método especial que devuelve informacion en forma de array)

Podemos observar, en la clase Factura, que en vez de tener un “id_cliente” entre las variables de clase tenemos una variable “objetoCliente”; ya comentamos al principio que en OOP unos objetos pueden contener otros, así, desde el objeto Factura podremos acceder a todos los datos del cliente de forma inmediata en vez de tener que disparar un método que nos devuelva un objeto dataset que contenga un cliente. Tambien podemos darnos cuenta, en la clase Factura, que hay una variable a un “objetoListaLineaFactura”, hemos definido una clase LineaFactura que contiene información de una linea de factura, por lo que necesitaremos algún mecanismo que contenga todas las lineas de la factura, para ello usaremos un objeto “Lista” que, resumiendo, contiene un array con referencia a cada objeto LineaFactura. Veremos con detenimiento las clases para manejar este tipo de objetos (son clase programadas por mí ya que en xHarbour y Xailer no existen).

En el próximo artículo veremos con detenimiento el código fuente de cada clase y haremos pruebas sencillas de carga de datos para comprobar el funcionamiento de las clases.

Anuncios

13 comentarios

  1. soy nuevo en xailer y xharbour, pero tengo programas en clipper y algo que quisiera conservar son los menus verticales, he probado y nada se adapta a lo que quiero, lo mas cercano es Tmenu, pero abria que hacerle modificaciones, por lo que he leído, habría que crear una clase derivada de Tmenu y agregarle algunos métodos (corrígeme pues puedo decir algún disparate).
    Lo primero seria que el menú se desplegara en un área variable vertical, habría que indicar el vértice superior izquierdo, pues no necesariamente quiero que empiece desde arriba, y de acuerdo a la cantidad de items podría no llegar hasta abajo, debería estar siempre visible no como el popupmenu.
    Luego quisiera que los menús subsiguientes no aparecieran totalmente desplazados hacia la derecha, sino que lo estuvieran una determinada cantidad de pixeles o caracteres.
    Otra posibilidad que el menú pudiera estar formado de varias columnas, por si la cantidad de opciones no entrara en la pantalla, para no tener que usar scroll.
    podrías diseñar algo similar ?

  2. José Alfonso,

    Me ha interesado más este artículo… ya vas metiendo la cosa en honduras. Espero con muchas ganas la siguiente entrega.

    Me gustan estos articulos, porque mira, por mucho que te digan que existe la Programación Ágil, y te enteras que no es la que hacen programadores durante sesiones de fitness y que una clase de ella es la Programacion eXtrema y que no es la que sale del tecleo del progremeitor durante una sesion de barranking, pues sigue uno (yo) sin comprender cómo puedo tanta y supuestamente tan buenas técnicas aplicarlas a mi dia a dia.

    Saludos

    • Hola “Amigo” (no se por que, pero me gusta que mis amigos tengan nombre 😉 )

      Pues aún vienen más cosas que puede que te sorprendan. A mi me gusta mas esta forma de programar que la de los dataset, me parece más “natural”.

      Un abrazo, amigo.

  3. Hola Jose Alfonso:
    Aunque llevo ya un tiempo con Xailer y xHarbour, cuando he querido aprender algo de POO he tenido que tirar de un libro de C# y ir traspasando las ideas de C# a xHarbour, por lo que se agradece que alguien se haya tomado la molestia de explicar POO con xHarbour, por lo tanto muchas gracias, de seguro que a más de uno nos vas a abrir los ojos con tus artículos.

    Repito José Alfonso, muchas gracias y espero tus siguientes posts.

    Emilio Gil.

    • Hola Emilio,

      Cierto, faltaba información para programar OOP con xHarbour. Era un vacío conocido desde hace mucho tiempo, intente varias veces ponerme a explicar POO de forma amena pero todo quedo en aquellos artículos sobre MVC y modelado de datos con dataset. Ahora tengo más conocimientos de POO, lo que se aprende en un curso de Java de 4 meses es impresionante, y cuando me di cuenta que llevar gran parte de esa forma de trabajo a xHarbour y Xailer no era complicado fue el inicio del trabajo.

      Espero os guste.

      Muchas gracias por comentar.

      Un abrazo.

  4. Señores,

    El paradigma OOP ya venía, en una implementación básica, en Objects de Linares. Por tanto no se a que se refieren cuando hablan de aprender OOP. Otra cosa, y supongo que es por donde van los tiros es aprovechar mejor la OOP en nuestros desarrollos habituales. Entiendo que ambos dos van por ahí. Es cierto, al menos a mi me pasa, no utilizo datasets que entiendo son más avanzados, digo que es cierto que la OOP la utilizamos básicamente en el aspecto de reutilización del código y quizá a lo que JA. nos quiere llevar es que modelemos nuestra cabeza con esquemas OOP antes de pasar a desarrollar usando OOP.

    Quizá dije alguna majadería. Perdonen pues.

    De nuevo muchas gracias JA. Tengo pendiente lo del nombre.
    Saludos

    • Hola “Amigo”,

      Por supuesto que el paradigma OOP venia con aque Objects de Linares :-). Aprender OOP no es aprender el paradigma, las sentencias para contruir clases y desarrollar métodos o aprender a usar una colección de clases existentes. Como bien dices, los tiros van por aprovechar todo lo que podamos de OOP en nuestros desarrollos habituales y que, por supuesto, mi intención es conseguir que pensemos modelando OOP y no olvidando que la reutilización de códido es una de las bases de la OOP.

      Y no dijiste ninguna majaderiía, al contrario, muy acertado tu comentario.

      Muchas gracias y un abrazo.

  5. JA,

    Eres muy amable.

    Un fuerte abrazo para ti también.

  6. He tratado de poner un texplorerbar y dentro un tmenu pero no funciona, tal vez por que uno es un control y el otro un componente?

  7. Muchas gracias José Alfonso por compartir, con gusto me pongo a estudiar. Saludos Cordiales.

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: