miércoles, 31 de agosto de 2016

FASCÍCULO 3.

¿Qué es la programación orientada a objetos?
Cualquiera que haya programado un poco se dará cuenta de la importancia que tiene para el programador la documentación. Documentación que le sirve tanto a él como a otras personas.
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, procedimientos, etc, que  tengan cosas en común, de forma que cuando un programador las utilice sepa dónde encontrarlas. Un “nuevo” concepto que incluye la generación de aplicaciones “autodocumentales”. 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.
Según lo expuesto anteriormente, la P00 (Programación Orientada a Objetos) es una forma de programación que utiliza objetos que responden a sucesos. Estos sucesos producen un flujo de mensajes entre los objetos, lo que origina cambios en los estados del objeto que recibe el mensaje.
La programación orientada a objetos puede llevarse a cabo con lenguajes convencionales, pero esto exige al programador la construcción de los mecanismos de que disponen los lenguajes orientados a objetos. Por ellos, lo mas apropiado es utilizar directamente un lenguaje orientado a objetos, ya que estos soportan los mecanismos y características, tales como objetos, clases, métodos, mensajes, herencias, etc. La herencia constituye uno de los mecanismos mas potentes de la programación orientada a objetos.
Las ventajas de la Programación Orientada a Objetos son:
  • Los objetos bien diseñados son la base para sistemas que se construyen a partir de los módulos reutilizables, dando lugar a una mayor productividad.
  • La reutilización de la clase que ha sido probada en circunstancias reales, en proyectos anteriores, dan lugar a sistemas de mayor calidad y con menos errores.
  • La herencia  hace posible definir sistemas más fiables, más fáciles de ampliar y menos costosos que mantener.
  • Un diseño orientado a objetos es una herramienta clave para enfrentar a problemas complejos porque favorece el paso de pequeños a grandes sistemas.
  • Las aplicaciones requieren escribir menos líneas de código, menos sentencias de bifurcación y por lo tanto, los módulos son más comprensibles.
  • La encapsulación ayuda a construir sistemas seguros más seguros.
  • En contraste con la programación tradicional, donde siempre existe la posibilidad de que una modificación de un procedimiento o de una escritura de datos afecte a otros procedimientos, la programación orientada a objetos no necesita examinar todo el código fuente para ver si un cambio local afecta a otras partes.
A pesar de las ventajas citadas, también presenta ciertas desventajas que son:
  • La ejecución de una aplicación orientada a objetos resulta algo más lenta.
  • Es preciso desarrollar bibliotecas de clase, lo que obliga al usuario a tomar conocimientos de ellas.
  • Hay costos inevitables, asociados al entrenamiento y aprendizaje.
  • La administración de bibliotecas de componentes es difícil y costosa.
  • Es necesario un cambio en la forma de pensar.
Una clase se puede considerar como una plantilla para crear objetos de esa clase o tipo. Una clase describe los métodos y atributos que definen las características comunes a todos los objetos de esa clase. Precisamente la clave de la programación orientada a objetos esta en abstraer los métodos y atributos comunes a un conjunto de objetos y encapsularlos en una clase.
Una clase es un tipo de objeto definido por el usuario. En otras palabras, una clase equivale a la generalización de un tipo específico de objetos. Un objeto es la concreción de una clase (algunos autores utilizan el término instancia, traducción directa de instance). Por ejemplo, un objeto de la clase C sería un ejemplar O de esa clase. Entonces, para disponer de un objeto, primero se abstraen las características comunes de ese grupo de objetos, después se delimitan esas características comunes(clase) y por último se poner nombre a uno o más ejemplares de las clases(objetos).
Aunque en las definiciones anteriores hemos utilizado el termino objeto como sinónimo de instancia, en general, cuando hablamos de objetos nos referimos, dependiendo del contexto, a clases o instancias. Esto es así, por que un objeto es, por una parte, un principio de organización, y por otra una región de almacenamiento que contiene una copia de elemento especificado por una clase.
¿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.
Veamos un ejemplo:
  • Abrir un nuevo proyecto
  • En el menú insertar selecciona “módulo de clase”. Aparecerá en la ventana de nuestro proyecto el nuevo archivo Class1.
Analicemos el nuevo archivo:
Para poder acceder a sus propiedades seguramente no te baste con seleccionarlo en la ventana del proyecto y pulsar F4 sino que tendrás que abrirlo haciendo docle Clic sobre él y posteriormente pulsar F4.
Al hacer esto observamos que tiene tres propiedades.
1. Propiedad “Instancing” Nos indica, en caso de que queramos hacer pública la clase (ya explicaremos esto) si podremos crear cero, una o instancias de la clase (objetos). De momento poner Not Creatable.
2. Propiedad “Name”. Con esta propiedad damos nombre a la clase que queremos crear. En nuestro ejemplo el nombre más apropiado sería “ventana”.
3. Propiedad “Public”. Como ya te imaginarás con esta propiedad determinamos si hacemos o no pública nuestra clase (si queremos o no que otras aplicaciones puedan crear nuevos objetos de la clase ventana). De momento poner False. Nota: al poner false en esta propiedad se ignora el valor de la propiedad “Instancing”.
Ya hemos creado la clase ventana ¿Qué te parece? ¿sencillo no?
Ya estamos en disposición de empezar a crear 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:
Public estado as integer ´1 abierta, 0 cerrada
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´Ábramos la ventana de 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 como desees. Por ejemplo crearemos la ventana del baño.
Dim Ventana_baño As new ventana
Ventana_baño.abrir
Ventana_baño.cerrar
etc
¿Qué te 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, “librería.vbp”
Al hacerlo observarás que se ha generado un archivo llamado ventana.cls. Este es el archivo de definición de la clase
Si ahora quieres utilizar el objeto, ventana en nuevos proyectos basta con que éstos insertes el archivo de clase.ventana.cls
Cada proyecto que utilice el objeto ventana tendrá que tener insertado el archivo ventana.Esto ha de ser así porque no hemos dicho que clase sea pública.
A continuación revisaremos 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ás intuido, para que nuestro proyecto pueda servir el objeto por la 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?
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:
  • Insertar un módulo (normal) en el proyecto (module1)
  • Si quieres puedes borrar el formulario Form1, ya que para nuestros propósitos no nos es de utilidad.
  • Escribir en el módulo el procedimiento Sub Main vacío.
Sub Main()
End Sub
  • Acceder a las propiedades de la clase ventana y hacerla pública. Para ello en la propiedadPublic poner True. Si quieres que distintas aplicaciones puedan crear más de una instancia (objeto) poner la propiedad Instancing a Creatable MultiUse.
  • Guardar el proyecto.
Repasemos. En nuestro proyecto tenemos un archivo llamado ventana.cls que define la clase ventana. También tenemos un módulo con un procedimiento Sub Main sin código alguno. No tenemos nada más. Además nuestra clase es pública y multiuse.
Ya reunimos todos los ingredientes para hacer de nuestro proyecto un servidor OLE.
Acceder al menú Archivo y seleccionar “crear archivo Ole Dll
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 observarlo. 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 “librería.dll”.
Una vez encontrada observemos el valor de las siguientes constantes:
  • InprocServer32 = “c\windows\escritorio\librería.dll” Esta constante indica el camino hasta la dll que hemos creado. Cada vez que queremos crear una instancia de una clase contenida en esta dll, el sistema la buscará ahí.
  • ProglD = “project1.ventana”. Este valor es muy importante. Será la cadena que deberemos escribir cuando desde nuestras aplicaciones queramos crear una instancia de ventana.project1 es la aplicación que nos sirve la clase ventana.
Una vez visto esto podemos salir del editor del registro de Windows e intentemos crear un objeto ventana para utilizar en una aplicación de Visual Basic.
¿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 Form 1.
Dim ventana_cocina As Object
Set ventana_cocina = Create Object(“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 te habrá ocurrido, sería útil, a medida que hacemos aplicaciones, crear una especie de librería de objetos (es decir clases) para ser utilizada en cualquier momento. Todos ellos dentro de, por ejemplo, librería.dll. De esta forma todo será más fácil de encontrar.
Ah, otra cosa, no creas que nos olvidamos 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 nos ocuparía varias líneas y no expresarlo bien. Lo mejor es que escribas código lograríamos en ellos y ejecutes paso a paso para darnos cuenta del momento exacto en el que se ejecutan. Basta 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.

No hay comentarios:

Publicar un comentario