Está en la página 1de 30

Programacin orientada a objetos

La programacin orientada a objetos o POO (OOP segn sus siglas en ingls) es un paradigma de programacin que usa objetos y sus interacciones, para disear aplicaciones y programas informticos. Est basado en varias tcnicas, incluyendo herencia, abstraccin, polimorfismo y encapsulamiento. Su uso se populariz a principios de la dcada de los aos 1990. En la actualidad, existe variedad de lenguajes de programacin que soportan la orientacin a objetos.
Contenido
[ocultar]

1 Introduccin 2 Origen 3 Conceptos fundamentales 4 Caractersticas de la POO 5 Resumen 6 Lenguajes orientados a objetos

7 Enlaces externos

[editar]Introduccin
Los objetos son entidades que combinan estado (atributo), comportamiento (mtodo) e identidad:

El estado est compuesto de datos, ser uno o varios atributos a los que se habrn

asignado unos valores concretos (datos).

El comportamiento est definido por los procedimientos o mtodos con que puede operar

dicho objeto, es decir, qu operaciones se pueden realizar con l.

La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras

palabras, es su identificador (concepto anlogo al de identificador de una variable o unaconstante). Un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interaccin llamados mtodos, que favorecen la comunicacin entre ellos. Esta comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.

Los mtodos (comportamiento) y atributos (estado) estn estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos para poder tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podra producir el hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos que manejen a las primeras por el otro. De esta manera se estara realizando una programacin estructurada camuflada en un lenguaje de programacin orientado a objetos. La POO difiere de la programacin estructurada tradicional, en la que los datos y los procedimientos estn separados y sin relacin, ya que lo nico que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programacin estructurada anima al programador a pensar sobre todo en trminos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programacin estructurada slo se escriben funciones que procesan datos. Los programadores que emplean POO, en cambio, primero definen objetos para luego enviarles mensajes solicitndoles que realicen sus mtodos por s mismos.

[editar]Origen
Los conceptos de la programacin orientada a objetos tienen origen en Simula 67, un lenguaje diseado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cmputo Noruego en Oslo. En este centro, se trabajaba en simulaciones de naves, que fueron confundidas por la explosin combinatoria de cmo las diversas cualidades de diferentes naves podan afectar unas a las otras. La idea surgi al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamientos. Fueron refinados ms tarde en Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versin fue escrita sobre Basic) pero diseado para ser un sistema completamente dinmico en el cual los objetos se podran crear y modificar "sobre la marcha" (en tiempo de ejecucin) en lugar de tener un sistema basado en programas estticos. La programacin orientada a objetos se fue convirtiendo en el estilo de programacin dominante a mediados de los aos ochenta, en gran parte debido a la influencia de C++, una extensin del lenguaje de programacin C. Su dominacin fue consolidada gracias al auge de las Interfaces grficas de usuario, para las cuales la programacin orientada a objetos est particularmente bien adaptada. En este caso, se habla tambin de programacin dirigida por eventos. Las caractersticas de orientacin a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adicin de estas caractersticas a los lenguajes que no fueron diseados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del cdigo. Los lenguajes orientados a objetos "puros", por su parte, carecan de las caractersticas de las cuales muchos programadores haban venido a depender. Para saltar este obstculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en mtodos orientados a objetos, pero permitiendo algunas

caractersticas imperativas de maneras "seguras". El Eiffelde Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparicin de Internet, y a la implementacin de la mquina virtual de Java en la mayora de navegadores. PHP en su versin 5 se ha modificado, soporta una orientacin completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a objetos.

[editar]Conceptos

fundamentales

La programacin orientada a objetos es una forma de programar que trata de encontrar una solucin a estos problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La

instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas.

Herencia: (por ejemplo, herencia de la clase C a la clase D) Es la facilidad mediante la cual

la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos mtodos y variables pblicas declaradas en C. Los componentes registrados como "privados" tambin se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y slo pueden ser accedidos a travs de otros mtodos pblicos. Esto es as para mantener hegemnico el ideal de OOP.

Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de

comportamiento o funcionalidad (mtodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.

Mtodo: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se

desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: Es un suceso en el sistema (tal como una interaccin del usuario con la mquina, o

un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Tambin se puede definir como evento, a la reaccin que puede desencadenar un objeto, es decir la accin que genera.

Mensaje: una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus

mtodos con ciertos parmetros asociados al evento que lo gener.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase

de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus

caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin de algn mtodo.

Estado interno: es una variable que se declara privada, que puede ser nicamente

accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.

Componentes de un objeto: atributos, identidad, relaciones y mtodos. Identificacin de un objeto: un objeto se representa por medio de una tabla o entidad que

est compuesta por sus atributos y funciones correspondientes. En comparacin con un lenguaje imperativo, una "variable", no es ms que un contenedor interno del atributo del objeto o de un estado interno, as como la "funcin" es un procedimiento interno del mtodo del objeto.

[editar]Caractersticas

de la POO

Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos", las caractersticas siguientes son las ms importantes:

Abstraccin: denota las caractersticas esenciales de un objeto, donde se capturan sus

comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin. El proceso de abstraccin permite seleccionar las caractersticas relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstraccin es clave en el proceso de anlisis y diseo orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.

Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse

pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar lacohesin de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente.

Modularidad: Se denomina Modularidad a la propiedad que permite subdividir una

aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. Estos mdulos se pueden compilar por separado, pero tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de diversas formas.

Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo natural, y

cada tipo de objeto expone una interfaz a otros objetos que especifica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin entera se reduce a un agregado o rompecabezas de objetos.

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden

compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una

jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos enclases y estas en rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple.

Recoleccin de basura: la recoleccin de basura o garbage collector es la tcnica por la

cual el entorno de objetos se encarga de destruir automticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignacin o liberacin de memoria, ya que el entorno la asignar al crear un nuevo objeto y la liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se extendieron para soportar el Paradigma de Programacin Orientada a Objetos como C++ u Object Pascal, esta caracterstica no existe y la memoria debe desasignarse manualmente.

[editar]Resumen
La programacin orientada a objetos es un paradigma que utiliza objetos como elementos fundamentales en la construccin de la solucin. Surge en los aos 70. Un objeto es una

abstraccin de algn hecho o ente del mundo real que tiene atributos que representan sus caractersticas o propiedades y mtodos que representan su comportamiento o acciones que realizan. Todas las propiedades y mtodos comunes a los objetos se encapsulan o se agrupan en clases. Una clase es una plantilla o un prototipo para crear objetos, por eso se dice que los objetos son instancias de clases.

[editar]Lenguajes

orientados a objetos

Simula (1967) es aceptado como el primer lenguaje que posee las caractersticas principales de un lenguaje orientado a objetos. Fue creado para hacer programas de simulacin, en donde los "objetos" son la representacin de la informacin ms importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo cannico, y con el que gran parte de la teora de la programacin orientada a objetos se ha desarrollado. Entre los lenguajes orientados a objetos se destacan los siguientes:

ABAP ABL Lenguaje de programacin de OpenEdge de Progress Software ActionScript ActionScript 3 Ada C++ C# Clarion Clipper (lenguaje de programacin) (Versin 5.x con librera de objetos Class(y)) D Object Pascal (Delphi) Gambas Harbour Eiffel Java JavaScript (la herencia se realiza por medio de la programacin basada en prototipos) Lexico (en castellano) Objective-C Ocaml Oz R Perl (soporta herencia mltiple. La resolucin se realiza en preorden, pero puede

modificarse al algoritmo linearization C3 por medio del mdulo Class::C3 en CPAN)

PHP (a partir de su versin 5) PowerBuilder Python Ruby Smalltalk (Proyecto investigativo. Influenci a Java.) Magik (SmallWorld) Vala VB.NET Visual FoxPro (en su versin 6) Visual Basic 6.0 Visual Objects XBase++ Lenguaje DRP Lenguaje de programacin Scala (lenguaje usado por Twitter) http://www.scala-

lang.org/page.jsp Muchos de estos lenguajes de programacin no son puramente orientados a objetos, sino que son hbridos que combinan la POO con otros paradigmas. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados aadiendo extensiones orientadas a objetos a un lenguaje de programacin clsico. Un nuevo paso en la abstraccin de paradigmas de programacin es la Programacin Orientada a Aspectos (POA). Aunque es todava una metodologa en estado de maduracin, cada vez atrae a ms investigadores e incluso proyectos comerciales en todo el mundo.

Programacin Orientada a Objetos Qu es POO? 28 DUTC DICIEMBRE DUTC 2007 POR THE FRICKY! 10 COMENTARIOS Hace tiempo haba prometido a mis alumnos de ActionScript que les dara algunos apuntes acerca de la Programacin Orientada a Objetos y cmo aplicarla en AS2. Pues bien, el momento de cumplir esa promesa ha llegado; para ello voy a darme a la tarea de estructurar una serie de posts al respecto, tratando de comprender lo que significa la Programacin Orientada a Objetos y como aplicarla en AS2 dirigida a no-programadores (que son la mayora de mis alumnos). La idea que tengo en mente es estructurar un material que permita entrar en el fascinante mundo de la Programacin, principalmente pero no limitndonos a AS2, para luego hacer un paso seguro y firme a AS3 y ver tambin como podemos aplicar esto en otros lenguajes sumamente tiles en el desarrollo web, como PHP y Javascript. Ya veremos como nos va.

Qu es la Programacin Orientada a Objetos? La P.O.O. (tambin conocida como O.O.P., por sus siglas en ingls) es lo que se conoce como un paradigma o modelo de programacin. Esto significa que no es un lenguaje especfico, o una tecnologa, sino una forma de programar, una manera de plantearse la programacin. No es la nica (o necesariamente mejor o peor que otras), pero se ha constituido en una de las formas de programar ms populares e incluso muchos de los lenguajes que usamos hoy da lo soportan o estn diseados bajo ese modelo (PHP, AS2, AS3,). Lo que caracteriza a la POO es que intenta llevar al mundo del cdigo lo mismo que encontramos en El Mundo Real. Cuando miramos a nuestro alrededor qu vemos? pues, cosas, objetos, pero podemos reconocer estos objetos porque cada objeto pertenece a una clase, eso nos permite distinguir, por ejemplo, un perro de un auto (porque son de clases diferentes) y tambin un TV de otro (porque, aunque sean iguales, cada uno es un objeto distinto). ste es el modelo que la POO intenta seguir para estructurar un sistema. Es importante recalcar nuevamente que la POO no es un lenguaje de programacin, es una forma de enfrentarse a ella. Esto significa que la POO le servir para desarrollar en muchos de los lenguajes comunes de hoy en da (incluso en ASPuaj!) manteniendo un mismo esquema mental. Incluso le permitir enfrentar otros proyectos que no necesariamente estn relacionados con escribir cdigo (Advertencia: La P.O.O. no cura el cncer ) Caractersticas de la P.O.O.: No hay un acuerdo aceptado por todo el mundo respecto a cules son las caractersticas que definen la POO, pero al menos todos concuerdan en estas tres: 1. Abstraccin. 2. Encapsulacin. 3. Herencia. Abstraccin: Cada vez que pronunciamos una palabra, realmente lo que hacemos es asociar ese sonido (o ese conjunto de garabatos al escribir) con una serie de cosas. Decimos que una ave es tal cosa, que una silla es tal otra, etc. Cuando vamos a aplicar la POO, lo primero que debemos hacer es cumplir con una vieja mxima de guerra:Divide y Vencers. Es decir, lo que hacemos es seccionar nuestro cdigo en grupos de cdigo ms pequeo que, al unirlos, hacen el trabajo. Un buen ejemplo de abstraccin es el cuerpo humano, aunque el cuerpo es una unidad, est dividido en lo que

conocemos por sistemas (el sistema respiratorio, el sistema linftico, cardiovascular, etc., etc.). Estos sistemas, a su vez estn compuestos por otros ms pequeos: los rganos, y as sucesivamente. La abstraccin nos permite dividir nuestro programa en distintos objetos que se agrupan para formar cosas ms complejas. Pero qu demonios es realmente la abstraccin? Bsicamente es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de forma singular. Como cuando describimos el cuerpo humano y decimos cabeza, brazo(s), pierna(s), etc. Encapsulacin: Tambin conocida como ocultamiento. Cuando me acuesto a ver televisin no me preocupo del modo como ste funciona, o lo que hace para cambiar de canal o aumentar el volumen. A menos que seas experto en electrnica o tcnico en televisores, te pasar lo mismo: no lo sabes y no te importa; slo sabes que al presionar un botn ocurre la magia. La encapsulacin se encarga de mantener ocultos los procesos internos que necesita para hacer lo que sea que haga, dndole al programador acceso slo a lo que necesita. Esto da dos ventajas iniciales: Lo que hace el usuario puede ser controlado internamente (incluso sus errores), evitando que todo colapse por una intervencinindeseada (t no quieres que tu mam, que no tiene ni idea de electrnica, abra tu televisor y empiece a jugar con los circuitos para cambiar los canales manualmente verdad?). La segunda ventaja es que, al hacer que la mayor parte del cdigo est oculto, puedes hacer cambios y/o mejoras sin que eso afecte el modo como los usuarios van a utilizar tu cdigo. Slo tienes que mantener igual la forma de acceder a l (en el caso del control de la tele, que los botones sigan siendo los mismos y que el botn de apagado no cambie el volumen). Por cierto, estaspuertas de acceso que das a los usuarios son lo que se conoce como interfaz. Herencia: Uno de los elementos (a mi modo de ver) ms interesantes de la P.O.O. La herencia es la capacidad que tiene una clase de derivar las propiedades y mtodos de otra (suena a chino no? Calma, lo veremos luego con paciencia ). Tratemos de explicarlo con un ejemplo: Decimos que una gallina es un ave; esto quiere decir que las gallinas tienen caractersticas comunes con otras aves (pico, plumas, etc.), es decir que la gallina hereda las caractersticas comunes de todas las aves. Pero adems, resulta que un ave es un animal, lo que significa que tambin comparte caractersticas comunes al caballo, el perro, el hombre (seeee, somos animales) y cualquier otra cosa que pueda ser clasificada comoanimal. La herencia nos permite, entre otras cosas, evitar tener que escribir el mismo cdigo una y otra vez, puesto que al definir que una categora (que

en programacin llamaremos clase) pertenece a otra, automticamente estamos atribuyndoles las caractersticas generales de la primera, sin tener que definirlas de nuevo. Qu es una Clase? Cuando decimos ave, sabemos que nos referimos a algo con plumas, pico, dos patas, etc. No importa realmente si hemos visto un ave o no, o si tenemos un ave frente a nosotros; entendemos claramente que la palabra ave se refiere a alguna cosa que cumple con unas caractersticas especficas, se comporta de una forma concreta, etc, etc. No es ms que una palabra, pero nos permite clasificar las cosas. Por ejemplo, sabemos que una gallina es un ave y que un perro no es un ave. La clasificacin es algo que hacemos todos los das, a cada momento (entre otras cosas, nos libra de utilizar medias como guantes o baarnos en el comedor en vez de en la ducha). Cada vez que decimos que algo esalguna cosa, estamos clasificndolo, asocindolo a una clase. Sin embargo, sabemos que la palabra ave no se refiere a un animal concreto, sino a una serie de animales. Avees la palabra que usamos para identificarlos en un grupo, pero no podemos decir hoy har volar la palabra ave(bueno, puedes decirlo, pero estars cada vez ms cerca del manicomio), en tal caso siempre nos referiremos aesta o aquella ave, siempre hablaremos de un animal concreto. La palabra es lo que conocemos como unconcepto, una abstraccin. En la POO ocurre igual, una clase no es ms que una serie de cdigo que define a todos los elementos relacionados con ella. As, podramos escribir la clase ave colocando en ella todas las caractersticas que tienen las aves (pico, color, alto, ancho, patas,) esas caractersticas las llamaremos en lenguaje de programadores,propiedades. Pero la cosa no termina all, resulta que las aves tienen tambin ciertos mecanismos especficos, como comer, dormir, reproducirse (aljate Pertvertvaz! ), etc. Estos mecanismos los llamamos mtodos. Por ltimo, tambin sabemos que las aves reaccionan ante ciertos sucesos, como peligro, atraccin, defensa A esto lo llamaremos eventos. Entonces, vemos que una clase es algo as como el concepto de lo que queremos hacer, es como la idea (concebida al detalle) de la cosa, del objeto; pero igual que con las ideas, no puedo hacer nada directamente con una clase (puedes sentarte en una silla, pero no en tu idea de una silla). Sin embargo, esta idea ser la que d forma al objeto que crearemos (que tendr las caractersticas, mecanismos y comportamientos que habamos pensado en nuestra idea).

Qu es una Instancia? Bien, decamos que una clase es como la definicin de un objeto, pero no es el objeto en s, del modo como una idea no es una cosa fsica (el ejemplo de la silla). As que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia. En un mismo proyecto puedo tener una o ms instancias de una misma clase sin problemas. Cada vez que creamos una nueva instancia, sta adquiere las propiedades, mtodos y eventos de la clase a la que pertenece (es lo que permite la relacin es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas: 1. Si hago algn cambio en la clase, todas las instancias de esta clase se actualizarn automticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente). 2. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las dems (como tener una silla negra, una roja, una ms alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al cdigo. Es importante tener en cuenta que cada lenguaje tiene, de acuerdo a su sintaxis, sus propias normas sobre cmo escribir clases. No ser lo mismo en PHP que en AS2 o incluso AS3. As que, primero, hablaremos en

un sentido ms general, para luego pasar a la prctica concreta. Para los efectos, usaremos como lenguaje de ejemploAction Script 2.0. Estructura de la Clase Los elementos bsicos de una clase se estructuran de la siguiente forma (ms abajo definiremos cada elemento): 1. Paquete al que pertenece la clase (package slo en AS3, en AS2 se incluye en la Definicin de la Clase). 2. Definicin de la Clase (class En AS2, si la clase est incluida en un paquete, se usa la sintaxispaquete.clase). 3. Variables Internas (Son de uso interno de la clase, por lo que se restringe su uso fuera de ellas con la palabra clave private, as la variable miVar, de tipo numrico, podra definirse as: private var miVar:Number = 0;) 4. Constructor de la Clase (excepto en el caso de las clases estticas, pero de eso hablaremos en otro post). 5. Propiedades, Mtodos y Eventos de la Clase (no necesariamente en ese orden, pero es una buena forma de organizarlo). Por supuesto, una clase bien hecha contiene adems comentarios con informacin sobre la clase, la forma de usarla, su autor, etc. En este caso lo omitimos para concentrarnos en lo bsico y no enredarnos ms de lo estrictamente necesario. Dicho esto, veamos los puntos nombrados arriba en una clase de ejemplo, para luego pasar a explicar los conceptos:

Para crear una nueva instancia de la clase Persona debemos importarla y luego instanciar con la palabra clave new, pasndole los parmetros que necesita: import cesarfrick.Persona; var cesar:Persona = new Persona("Csar", "Frick", 36); Ahora expliquemos de qu se trata lo que hemos dicho: Paquete:

Aunque podemos colocar nuestras clases en el mismo directorio donde se encuentra el archivo que los usar, siempre resulta ms ordenado y eficiente clasificarlos en carpetas, donde podemos colocar aquellas clases que tienen un mismo propsito. As podemos tener una carpeta llamada graph para clases de tipo grfico,externalData para clases que conectan y/o procesan datos externos, etc. Estas carpetas son conocidas comopaquetes. Otra ventaja de usar paquetes (adems de mantener nuestras clases ordenadas) es que nos permiten importar todas las clases que necesitemos de ellos con slo una lnea: import paquete.*, en vez de tener que hacer un import para cada clase. Si te preocupa que terminen importndose ms clases de las que necesitas de ese paquete, no hay problema porque slo se importarn las que sean necesarias y no las que no utilices en el cdigo. En algunos lenguajes, existen palabras reservadas para declarar el paquete al que pertenece una clase (como en el caso de AS3), en estos casos va primero la declaracin del paquete y luego la de la clase. En AS3 sera de esta forma: package nombreDelPaquete{ class NombreDeLaClase{ ... } } Clase: La clase, propiamente dicha, se declara con la palabra clave class. Hay un par de cosas que debemos tener en cuenta cuando creamos una clase:

No es obligatorio, pero por regla general -los entendidos lo llaman convencin y es cuando todos se ponen de acuerdo en hacer algo de la misma forma (ja! como si tal cosa fuese posible. Errr perdn, eso es otro tema)- los nombres de las clases siempre comienzan con maysculas. Esto si es obligatorio: El archivo donde se encuentra la clase debe tener el mismo nombre que sta, respetando maysculas y minsculas. Esto es importante porque los import usan el nombre del paquete (si lo hubiere) y la clase para ubicarlos en el disco, as que si usas diferentes nombres, nunca los hallar y dar error. Si el lenguaje no tiene una palabra reservada para definir el paquete (AS2, por ejemplo), la definicin de la clase sera as:

class nombreDelPaquete.NombreDeLaClase{ ... } Variables Internas o Privadas: En ltimo trmino, todas las propiedades de una clase son en realidad variables, pero no es conveniente que el usuario de la clase pueda manipular directamente estas variables, por ello se mantienen privadas, es decir, slo pueden llamarse y manipularse dentro del cdigo de la clase, pero no fuera de ellas (o sea que si se trata de llamar a una de estas variables desde la instancia, no funcionar). Para hacer que una variable/funcin sea privada, se le antepone la palabra private. Constructor: Es la funcin que se ejecuta cada vez que se crea una instancia de la clase, Si necesitamos que nuestra clase inicie con ciertos valores, colocamos los parmetros correspondientes entre los parntesis. La funcin constructora siempre devuelve Void (Vaco). Tambin puede haber casos en los que no queramos que la clase constructora ejecute ningn cdigo. Para ello simplemente la colocamos vaca, es decir, la declaramos pero no ponemos cdigo en ella. Si una clase no tiene un constructor, no puede ser instanciada. Propiedades, Mtodos y Eventos de la clase: Decamos antes que las propiedades son realmente variables dentro de la clase, pero para poder controlar qu puede cambiar o no el usuario de la clase, si los valores son correctos, etc. hacemos uso de unas funciones especiales para definir propiedades: get y set.

get permite al usuario recuperar el valor de la propiedad, leerlo, por lo que su salida debe ser correspondiente con la que se espera de la propiedad (por ejemplo, no tendra sentido que la propiedad nombre del ejemplo devolviese un nmero). Si slo creamos una funcin get para una propiedad, sta es de slo lectura. set es usado para darle un valor a la propiedad, normalmente se aaden aqu los controles para asegurarse que el valor que se asigna es del tipo deseado (y evitar que la clase colapse por un error de tipo de datos). La funcin de set, al ser para escribir en la propiedad no devuelve ningn tipo de datos, pero debe tener un parmetro que es el valor que se pasar a la variable. Al contrario de get, no puede haber una clase de slo escritura (despus de todo, no tiene ningn sentido tener una propiedad a la que se le pueda asignar un valor pero este no pueda ser recuperado). Los mtodos no son ms que funciones pblicas, que pueden tener o no datos y que afectan a la instancia de alguna forma.

Los eventos, al igual que los mtodos, son funciones, pero estos reaccionan ante alguna interaccin del usuario o pueden ser reescritos por ste. A ellos dedicaremos un post especial.

EVENTOS Los eventos son el medio como interacta una clase con otras o con el propio usuario, se encargan de avisar que algo ha ocurrido y de manejarlo de una forma o de otra. Cada vez que escribimos con nuestro teclado, que hacemos click en un botn o un link, que cambiamos el tamao de un objeto, estamos generando eventos. Es por ello que, cuando programamos, debemos tener en cuenta la posibilidad (no siempre necesaria, pero lo ser a medida que generemos clases cada vez ms complejas), tanto de manejar eventos que slo implican a nuestra clase como de generar nuestros propios eventos, de modo que los usuarios de nuestras clases (en principio nosotros mismos) puedan decidir cmo reaccionar su cdigo ante ellos. El modo de manejar los eventos en P.O.O. se conoce como emisor/receptor, tambin llamado despachador/escuchador o simplemente dispatcher/listener. En esta dupla, la primera parte (el emisor) se encargar de lanzar el evento, mientras la segunda se encargar de recibirlo y gestionarlo como sea necesario. La primera parte ser responsabilidad nuestra (los programadores de la clase) y la segunda es responsabilidad de quien utiliza la clase (en principio, tambin nosotros). Cada lenguaje tiene su propio manejador de eventos, que es el que nos permite, tanto lanzar los eventos como crear los receptores (escuchadores/listeners) que nos permitirn manejarlos. Realmente es una aplicacin del patrn Observer, del que hablaremos ms adelante, cuando hablemos de patrones, pero que necesariamente tocaremos en este post. En qu consiste la emisin/recepcin de eventos? Bsicamente, de lo que se trata es de avisar (en principio sin importar si alguien escucha o no) de algn cambio en el estado de la instancia, que puede ser un click en el objeto, el final de un proceso de carga o la terminacin de algn complejo proceso. Cada vez que el evento en cuestin ocurre, la instancia dir Hey, me ocurri este evento!!. Esto es lo que conocemos como broadcasting. Aqu es donde entra en juego el (los) receptor(es). ste se encargar de estar atento, de escuchar (de ah que se les llame listeners) el(los) evento(s) que ocurra en el emisor, y responder adecuadamente.

Para ejecutar esto correctamente, es necesario disponer de una clase que se encargue del manejo de los eventos, tanto de la emisin como de la recepcin de los mismos, un eventHandler; sta puede ser dada por el mismo lenguaje (por ejemplo, el eventDispatcher en AS) o creada por el propio programador. Veamos un ejemplo de uso en AS2: Despacho (emisin) de Eventos En este caso, haremos una pequea adaptacin de la clase que habamos creado al principio, para lanzar un evento cada vez que la persona cumple aos.

Bien, lo que hemos hecho es agregar, a nuestra clase Persona, un Despachador de Eventos, tambin le pedimos que , cada vez que se ejecute el mtodo cumpleanhos, lance un evento, que hemos llamado onBirthday. Para ello, hemos hecho lo siguiente: 1. Importamos la clase EventDispatcher, que es una clase esttica, por lo que no hace falta instanciarla (ms adelante hablaremos de las clases estticas). 2. La clase EventDispatcher requiere que declaremos tres funciones: addEventListener, removeEventListener ydispatch Event. Luego veremos para qu se utilizan.

3. En el constructor de la clase, inicializamos el Despachador (EventDispatcher.initialize(this)). 4. Para lanzar un evento, utilizamos en mdoto dispatchEvent, que requiere un objeto con dos propiedades:target, que ser el objeto que lanz el evento, y type, que ser el nombre del evento en s. Recepcin (escucha) de Eventos Bien, ya sabemos cmo despachar un evento (broadcasting). Ahora veamos cmo podemos capturar ese evento y manejarlo, ya sea en otra clase o en otra parte de nuestro cdigo:

1. En nuestro ejemplo, hemos creado dos nuevas personas: auyamaApesta (hola Aoyama ) y theParrot (no s cul de los dos es ms persona, pero igual servirn). Por supuesto, como ambas son instancias de la clase Persona, ambas pueden lanzar el evento onBirthday que creamos anteriormente. 2. Adems, hemos creado tambin un nuevo objeto, myListener, que ser el encargado de recibir y manejar el evento. 3. A travs del mtodo addEventListener, asociamos el objeto myListener a las instancias que hemos creado. Para ello le decimos: a.- El Evento que queremos recibir (en nuestro ejemplo, onBirthday) y; b.- El objeto que lo manejar (myListener) 4. Programamos, en el receptor (myListener) la funcin que deseamos manejar (onBirthday).

Este ltimo punto requiere especial atencin. Si nos fijamos, veremos que la funcin onBirthday recibe como parmetro un objeto (evt), que es el que enviamos en el EventDispatcher. Este objeto contiene dos propiedades: la primera es la propiedad target, que se refiere al elemento que enva el evento (en este caso, la instancia) y type, que nos dice el nombre del evento. Es por ello que al colocar evt.target.edad, nos estaremos refiriendo a la propiedad edad de la instancia en cuestin, igualmente con el nombre. Otra cosa a tener en cuenta es que hemos creado un slo listener que escuchar a las dos instancias, de modo que, en cada caso, responder a cualquiera de las dos que lance el evento. Igualmente, es posible asociar varios objetos como listeners de un mismo evento, lo que nos permite hacer que un evento genere una serie de acciones diferentes al mismo tiempo. Clases Dinmicas En oposicin a las clases cerradas existe lo que se conoce como clases dinmicas. Su principal caracterstica es que permiten agregar en tiempo de ejecucin, propiedades y mtodos a la clase, es decir, que yo puedo agregar una nueva propiedad a la instancia de mi clase, aunque sta no haya sido definida originalmente. Vemoslo con un ejemplo comparativo:

Como puedes ver, la nica diferencia entre Persona y Persona2 es que en el segundo caso hemos agregado, en la declaracin de la clase, la palabra clave dynamic. Esta palabrita es la que har toda la magia, ya que, como puedes ver en la implementacin (ms abajo, en la imagen), la instancia de Persona nos dar un error en tiempo de compilacin (dicindonos que la clase Persona no tiene una propiedad llamada apellido), mientras quePersona2 simplemente crear la nueva propiedad (fjate que no existe en la clase) y le colocar el valor correspondiente. De hecho, si has trabajado con AS2 (que supongo que as es), posiblemente esto sea algo que has implementado varias veces. En cualquier caso, no es recomendable usar clases dinmicas a menos que sea necesario, porque entre otras cosas, la verificacin

de datos es menos estricta que en las clases cerradas, lo que hace que se pierda control sobre los datos de la clase, hacindola susceptible de errores inesperados. Clases Estticas Por su parte, las clases estticas estn pensadas para contener elementos (propiedades o mtodos) que no dependen directamente de un objeto para su funcionamiento Cmo es eso? Veamos: En varias ocasiones nos encontramos con que tenemos una funcin que puede ser utilizada por distintos objetos, o en diferentes situaciones, que no estn relacionadas con algn objeto especfico, puede ser el caso de una operacin matemtica, un clculo, dibujar una forma geomtrica, etc. Sin las clases estticas la opcin sera: Crear esta misma funcin en cada clase que utilizamos (copiar y pegar no es reusabilidad). Pero esto es algo engorroso y poco prctico (qu pasa si queremos agregar un nuevo parmetro a nuestra funcin o conseguimos una forma ms efectiva de hacer lo mismo? Tendramos que reescribir el cdigo en cada clase donde lo hemos usado y t no quieres hacer eso verdad?). Un buen ejemplo de clases estticas es la clase Math, comn en ActionScript, Java, .Net, etc. Esta clase se encarga de hacer una serie de operaciones matemticas a las que slo les pasamos los parmetros que necesita. Otro ejemplo tpico sera una clase que se encargara de dibujar objetos. Es la que veremos en este ejemplo:

En este caso, tenemos una clase que contiene un slo mtodo (getSolidRectangle), que adems es de tipoesttico (lo sabemos por el uso de la palabra clave static en la declaracin del mtodo) y que dibuja un rectngulo con color de fondo slido en un mc que hemos enviado como primer parmetro. Si nos fijamos en la implementacin de la clase, veremos que slo tiene tres lneas: 1. Importa la clase. 2. Crea el movieclip donde dibujaremos el rectngulo. 3. Llamamos al mtodo getSolidRectangle para dibujar el rectngulo en cuestin Como te habrs dado cuenta, en este caso no hemos creado una instancia de Graph (que lo haramos con la palabra clave new). Esto se debe a que las clases estticas no se instancian (o sea, que no podemos crear objetos a partir de ellas), sino que podemos usar directamente sus elementos, simplemente apuntando a al clase

misma (Graph.getSolidRectangle()). Si alguna vez has usado la clase Math sabes de lo que estoy hablando. Es por eso que las clases estticas normalmente son utilizadas para albergar esos procedimientos que queremos reutilizar una y otra vez, pero que no estn directamente asociados a un objeto o una clase en particular. As, en vez de tener que escribir una y otra vez el mismo procedimiento, slo tenemos que importar la clase y usarla. Si luego queremos hacer cambios en el(los) procedimiento(s), hacemos los cambios en la clase esttica y estos se actualizarn automticamente en todos los sitios donde se utilice. Esto s es reusabilidad Un dato importante, cuando creamos una clase esttica, todos los elementos pblicos de dicha clase tambin deben ser estticos Clases Dinmicas En oposicin a las clases cerradas existe lo que se conoce como clases dinmicas. Su principal caracterstica es que permiten agregar en tiempo de ejecucin, propiedades y mtodos a la clase, es decir, que yo puedo agregar una nueva propiedad a la instancia de mi clase, aunque sta no haya sido definida originalmente. Vemoslo con un ejemplo comparativo:

Como puedes ver, la nica diferencia entre Persona y Persona2 es que en el segundo caso hemos agregado, en la declaracin de la clase, la palabra clave dynamic. Esta palabrita es la que har toda la magia, ya que, como puedes ver en la implementacin (ms abajo, en la imagen), la instancia de Persona nos dar un error en tiempo de compilacin (dicindonos que la clase Persona no tiene una propiedad llamada apellido), mientras quePersona2 simplemente crear la nueva propiedad (fjate que no existe en la clase) y le colocar el valor correspondiente. De hecho, si has trabajado con AS2 (que supongo que as es), posiblemente esto sea algo que has implementado varias veces. En cualquier caso, no es recomendable usar clases dinmicas a menos que sea necesario, porque entre otras cosas, la verificacin

de datos es menos estricta que en las clases cerradas, lo que hace que se pierda control sobre los datos de la clase, hacindola susceptible de errores inesperados. Clases Estticas Por su parte, las clases estticas estn pensadas para contener elementos (propiedades o mtodos) que no dependen directamente de un objeto para su funcionamiento Cmo es eso? Veamos: En varias ocasiones nos encontramos con que tenemos una funcin que puede ser utilizada por distintos objetos, o en diferentes situaciones, que no estn relacionadas con algn objeto especfico, puede ser el caso de una operacin matemtica, un clculo, dibujar una forma geomtrica, etc. Sin las clases estticas la opcin sera: Crear esta misma funcin en cada clase que utilizamos (copiar y pegar no es reusabilidad). Pero esto es algo engorroso y poco prctico (qu pasa si queremos agregar un nuevo parmetro a nuestra funcin o conseguimos una forma ms efectiva de hacer lo mismo? Tendramos que reescribir el cdigo en cada clase donde lo hemos usado y t no quieres hacer eso verdad?). Un buen ejemplo de clases estticas es la clase Math, comn en ActionScript, Java, .Net, etc. Esta clase se encarga de hacer una serie de operaciones matemticas a las que slo les pasamos los parmetros que necesita. Otro ejemplo tpico sera una clase que se encargara de dibujar objetos. Es la que veremos en este ejemplo:

En este caso, tenemos una clase que contiene un slo mtodo (getSolidRectangle), que adems es de tipoesttico (lo sabemos por el uso de la palabra clave static en la declaracin del mtodo) y que dibuja un rectngulo con color de fondo slido en un mc que hemos enviado como primer parmetro. Si nos fijamos en la implementacin de la clase, veremos que slo tiene tres lneas: 1. Importa la clase. 2. Crea el movieclip donde dibujaremos el rectngulo. 3. Llamamos al mtodo getSolidRectangle para dibujar el rectngulo en cuestin Como te habrs dado cuenta, en este caso no hemos creado una instancia de Graph (que lo haramos con la palabra clave new). Esto se debe a que las clases estticas no se instancian (o sea, que no podemos crear objetos a partir de ellas), sino que podemos usar directamente sus elementos, simplemente apuntando a al clase

misma (Graph.getSolidRectangle()). Si alguna vez has usado la clase Math sabes de lo que estoy hablando. Es por eso que las clases estticas normalmente son utilizadas para albergar esos procedimientos que queremos reutilizar una y otra vez, pero que no estn directamente asociados a un objeto o una clase en particular. As, en vez de tener que escribir una y otra vez el mismo procedimiento, slo tenemos que importar la clase y usarla. Si luego queremos hacer cambios en el(los) procedimiento(s), hacemos los cambios en la clase esttica y estos se actualizarn automticamente en todos los sitios donde se utilice. Esto s es reusabilidad Un dato importante, cuando creamos una clase esttica, todos los elementos pblicos de dicha clase tambin deben ser estticos Crear una Sub-Clase: Bien, esto es algo sumamente sencillo. Para crear una sub-clase slo necesitamos extenderla en la declaracin de la subclase: Ejemplo en AS2 class cfrick.utils.MyMovieClip extends MovieClip{ function MyMovieClip(){ ... } } Ejemplo en AS3: import flash.display.Sprite; package cfrick.utils{ classs mySprite extends Sprite{ function mySprite(){ ... } } } Como habamos dicho antes, ahora la clase myMovieClip (AS2) y mySprite (AS3) heredan todas las propiedades, mtodos y eventos de sus clases padre, que seran MovieClip y Sprite, respectivamente. Lo que seguira son las propiedades, mtodos y eventos correspondientes a esta clase en particular. Sobre-escribir Mtodos en una Sub-Clase: Digamos que tenemos un mtodo mover en nuestra clase: class A{ function A(){ ...

} public function mover(pixelstoMove:Number){ this._x += pixelstoMove; } } Ahora resulta que necesitamos hacer una subclase basada en A -que en un despliegue de creatividad, llamaremos B-, pero necesitamos cambiar un poco ese mtodo mover, al cambiar el mtodo, manteniendo la cantidad de parmetros y el tipo de datos de salida, lo estamos sobreescribiendo. En otras palabras, slo cambiaremos el cdigo dentro de la funcin y no la funcin en s. Por ejemplo: class B extends A{ function B(){ ... } public function mover(pixelstoMove:Number){ this._y += pixelstoMove; } } Esto significa que las instancias de A ejecutarn el mtodo mover en el eje de las x, mientras las instancias de B lo ejecutarn en el eje de las y. Sobrecargar Mtodos: Ya hablamos de cmo sobreescribir nuestros mtodos pero qu pasa si la sobreescritura no es suficiente, si necesitamos agregar o cambiar un parmetro, cambiar el tipo de dato del mtodo, etc.? Entonces es cuando sobrecargamos mtodos. La sobrecarga consiste en utilizar el mismo nombre de un mtodo existente, pero cambiando sus parmetros (ya sea usando otros o una cantidad de parmetros diferente) y, claro, cambiando tambin el cdigo correspondiente. Sobrecargar mtodos es una forma de dar nuevas opciones a los usuarios, permitiendo que un mismo mtodo realice diferente funciones dependiendo de los parmetros que se le enven. Un ejemplo de sobrecarga puede ser: class A{ public void message(){ //el cdigo correspondiente } public void message(string msg){ //el cdigo correspondiente

} } Acceder a la Super Clase: Una vez que hemos creado nuestra sub clase, sta hereda los mtodos y propiedades pblicas y protegidas (de ello hablaremos luego) de su super clase, para acceder a ellos desde nuestra subclase, debemos utilizar la palabra reservada super. Adems, esto es muy til por ejemplo, cuando sobreescribimos mtodos pero necesitamos en algn momento acceder al mtodo de la super clase.

También podría gustarte