¿Qué es y para qué sirve la programación orientada a objetos?
Cualquiera que haya programado un poco se dará
cuenta de la importancia que tiene para el programador la dichosa documentación.
Documentación que le sirve tanto a él como a otras personas
(todavía no he conocido a uno al que le guste realizar tan atractiva
labor).
Pero la cosa no se queda ahí, además
sin una buena documentación un programador pierde el tiempo en hacer
rutinas o procedimientos que ya estaban hechos con anterioridad y que posiblemente
él mismo hizo. También una aplicación con mala documentación
es muy difícil de depurar y de corregir errores posteriores a su
implementación.
¿ y qué tiene esto que ver con
la programación orientada a objetos ?
Este tipo de programación consiste en
agrupar en "objetos" aquel código, rutinas, procedimientos, etc,
que tengan cosas en común, de forma que cuando un programador las
utilice sepa dónde encontrarlas. Un "nuevo" concepto (entre
comillas porque en realidad no es nuevo, pero bueno) que incluye la generación
de aplicaciones "autodocumentadas". Una vez generado o construido un objeto
el programador, y los que vengan detrás, podrán olvidarse
por completo del objeto y sencillamente utilizarlo, al igual que hacemos
con los textbox, commands, grids, etc.
Argumentos a favor de la POO:
Imaginemos que queremos utilizar ventanas en
nuestro proyecto.
Queremos que estas ventanas puedan hacer dos
cosas, abrirse y cerrarse. Además una ventana deberá tener
una propiedad llamada "estado" que nos indique si está abierta o
cerrada.
Con Visual Basic, sin utilizar la potencia de
la POO escribiríamos algo parecido a esto:
Sub Cerrar()
estado = 0 'Cerramos la ventana
End Sub
Sub Cerrar (index as integer)
estado(index) = 1 'Cerramos
la ventana index
End Sub
¿ Cómo se crea una clase ?
Una clase se puede crear utilizando un módulo
de clase "class module".
Para crear un objeto, previamente hay que crear
una clase. Una clase define los métodos de los objetos y sus propiedades.
Vamos con un ejemplo:
Ya estamos en disposición de empezar a crear los métodos
y propiedades que van a definir la clase ventana.
Los métodos de una clase se definen sencillamente implementando
funciones o procedimientos en el "general" del módulo de tipo Public
Las propiedades se definen definiendo variables también
de tipo Public en el general del módulo.
Siguiendo con nuestro ejemplo, nuestra ventana ha de poder abrirse y cerrarse además de tener una propiedad llamada "estado" que nos indique si está abierta o cerrada.
Para definir pues la propiedad "estado" basta con escribir en el general del módulo de clase:
Para definir los métodos abrir y cerrar:
Public Sub abrir()
estado = 1
End Sub
Public Sub cerrar()
estado = 0
End Sub
¡Ya tenemos la clase ventana terminada!
¿Cómo se crea un objeto?
Siguiendo con el ejemplo creemos nuestro primer objeto ventana.
En el Form_Load del formulario del mismo proyecto (Form1) escribir
lo siguiente:
Dim Ventana_salita As New ventana ' Creamos mi Ventana_salita
Ventana_salita.abrir 'Abramos la ventana de la salita
estado = Ventana_salita.estado 'comprobemos que efectivamente se
ha abierto
Ventana_salita.cerrar 'Cerremos ahora la ventana
estado = Ventana_salita.estado
Ejecuta el código paso a paso para ir viendo el valor que va tomando la variable estado.
¿Qué ocurre si ahora queremos crear otra ventana? Puedes crear tantas ventanas (instancias de la clase ventana) como desees. Por ejemplo creemos la ventana del baño.
Dim Ventana_baño As New ventana
Ventana_baño.abrir
Ventana_baño.cerrar
,etc
¿Qué os parece? A partir de ahora el programador sólo deberá recordar que puede crear ventanas y que las ventanas se pueden abrir y cerrar. Además, si algún día desea revisar el código asociado a los métodos abrir o cerrar sabrá dónde encontrarlo sin dificultad; en la clase ventana.
A continuación guardemos el proyecto con el nombre, por ejemplo, "libreria.vbp" (más adelante entenderéis porqué le llamo así)
Al hacerlo observaréis que se ha generado un archivo llamado ventana.cls. Este es el archivo de definición de la clase (por deformación yo directamente le llamo: el objeto ventana, aunque no existe ningún objeto hasta que no se crea una instancia de la clase, como ya sabéis con la orden As New)
Si ahora queréis utilizar el objeto ventana en nuevos proyectos basta con que en éstos insertéis el archivo de clase ventana.cls
Ya sé lo que estáis pensando, que valla chapuza. Cada
proyecto que utilice el objeto ventana tendrá que tener insertado
el archivo ventana.cls.
Esto ha de ser así porque no hemos dicho que la clase sea pública.
A continuación nos metemos con ese tema.
¿Cómo se crea una clase pública?
Antes de meternos directamente con el procedimiento conviene tener una
serie de conceptos claros. Para que una aplicación pueda servir
a otras aplicaciones objetos ambas tienen que entenderse a través
de la interfaz de Automatización OLE.
Una aplicación hace de servidor OLE (servidor de objetos) y
otra de cliente. Por ejemplo, cuando hacemos unas tablas en Excel y las
queremos pegar en Word, Excel hace de servidor OLE y Word es el cliente.
Ambos se entienden a través de la interfaz de automatización
OLE y Excel le proporciona a Word el objeto "tabla" (en lugar de "ventana").
Así que, como habréis intuido, para que nuestro proyecto pueda servir el objeto ventana (ya que queremos que sea público) a otras aplicaciones deberemos convertir el proyecto en un servidor OLE.
¿Cómo se crea un servidor OLE? (sólo disponible en la versión profesional y para empresas)
Nada más sencillo (no diréis que no doy ánimos
:)).
Para que un proyecto con clases se convierta en un servidor OLE el
proyecto deberá contener además de las clases, un módulo
con el procedimiento Sub Main, aunque en éste no escribamos nada
de código. Así que manos a la obra:
Ya reunimos todos los ingredientes para hacer de nuestro proyecto un servidor OLE.
Acceder al menú Archivo y seleccionar "Crear archivo Ole dll"
(sólo disponible en la versión profesional y para empresas).
Dejar el nombre por defecto, que será "libreria.dll"
Si hemos llevado a cabo con éxito la operación se nos
habrá generado dicho archivo y además se habrá registrado
automáticamente en el registro de Windows.
Es interesante que accedamos al registro para ver un par de cosillas.
Para ello ir a Menú Inicio, Ejecutar. Poner "regedit".
Una vez dentro del editor del registro de windows lo más sencillo
para localizar los parámetros correspondientes a nuestro servidor
OLE es que utilicemos el comando buscar, introduciendo como cadena a buscar
"libreria.dll".
Una vez encontrada observemos el valor de las siguientes constantes:
¿Cómo se crea un objeto servido
por un servidor OLE?
Abramos un nuevo proyecto con Visual Basic y escribamos las siguientes
líneas de código en el Form_Load del formulario Form1.
Dim ventana_cocina As Object
Set ventana_cocina = CreateObject("proyect1.ventana")
Ya tenemos creado nuestro objeto sin necesidad de tener en el proyecto
el archivo de clase ventana.cls.
Como antes, podemos hacer:
ventana_cocina.abrir
ventana_cocina.cerrar
,etc
Como ya se os habrá ocurrido, sería útil, a medida que hacemos aplicaciones, crear una especie de librería de objetos (quiero decir clases) para ser utilizada en cualquier momento. Todos ellos dentro de, por ejemplo, libreria.dll. De esta forma todo será más fácil de encontrar.
Ah, otra cosa, no creáis que me olvido de los métodos Initialize y Terminate comunes a todas las clases. Simplemente decir que se suele utilizar para reinicializar y comprobar parámetros comunes a la clase. Explicar cuándo se producen ambos eventos me ocuparía varias líneas y no lograría expresarlo bien. Lo mejor es que escribáis código en ellos y ejecutéis paso a paso para daros cuenta del momento exacto en el que se ejecutan. Baste decir que el evento Initialize se produce inmediatamente antes de referirnos al objeto por primera vez y el evento Terminate se produce cuando se encuentra la primera línea de código que ya no hace referencia al objeto.
En fin, el tema lo doy por finalizado.
Espero haber transmitido la utilidad de generar aplicaciones con programación
orientada a objetos y que me hayáis entendido (más bien haberme
explicado).
Lógicamente el ejemplo de la ventana es totalmente ilustrativo.
Nadie va a crearse un objeto para hacer algo tan simple. Pero la potencia
de la POO nos facilita mucho las cosas cuando debemos agrupar procedimientos
o código que sea muy complejo y del que no nos queramos volver a
acordar. Simplemente creamos una instancia y la utilizamos.