Programación orientada a objetos (POO) Si algo produce temor, al coger cualquier interfaz de desarrollo moderna, es saber que su programación está orientada a objetos. El término en sí ya da miedo. Qué es eso de objetos y qué es lo que debemos variar respecto a nuestra programación estructurada tradicional, y además por qué hemos de hacerlo. Vamos a intentar desvelar los misterios se esconde y a convencernos de su validez y utilidad y, sobre todo, que no es tan complejo como parece indicarnos la teoría. La POO surge como una evolución natural de la programación estructurada acto seguido no es algo que rompa esquemas clásicos como podría suponerse. La POO formaliza técnicas utilizadas en dicha programación estructurada. Esta es la mejor manera de comprender en un primer momento su misión. Ahora bien, su definición es algo más obtusa y filosófica, ya que académicamente podemos decir que la POO aplica los objetos del mundo real a nuestras aplicaciones. De ahí el concepto de orientación a objetos. Un objeto es algo tangible que tiene unas características y un comportamiento. En el mundo real podemos hablar de objetos silla, automáticamente construimos en nuestro cerebro un determinado tipo de silla, pero en cualquiera de los casos lo hacemos siempre con las características con las que nuestra percepción reconoce el objeto silla. Tendrá un respaldo, un asiento, un soporte, un color, etc. Este concepto de silla es lo que llamamos clase. Una clase es la abstracción de un objeto, es algo intangible, es el conjunto de ideas, no es algo real. A la acción de crear un objeto partiendo de una clase se llama instanciamiento. Ya tenemos dos conceptos que en la POO van a ser fundamentales, las clases y los objetos. Nosotros pasaremos gran parte del tiempo dedicándolo a diseñar clases, a crear abstracciones que sean inherentes a muchos objetos, o mi- rándolo desde el punto de vista informático, al código que utilicemos repetidamente en muchos módulos. He aquí una de las claves de la POO reutilizar el código. Muchas veces hablaremos de clases y de objetos indistintamente, no hay que confundirlos, pero tampoco hay que considerarlos como algo distinto. Nosotros podemos manipular las clases y los objetos, mientras que el usuario sólo puede actuar sobre los objetos. En nuestras aplicaciones, por tanto, siempre debemos convertir, es decir instanciar las clases en objetos. Volviendo al ejemplo de la silla, si a la abstracción, esto es, a la clase silla, le damos unas características específicas como pueden ser: tapicería de cuero, color negro, soporte giratorio y con ruedas, respaldo doble de alto, tendríamos en la mente el nombre silla de ejecutivo. Es realmente un objeto, pero un objeto que tiene unas características tan definidas y que se repite en muchos objetos silla, que podemos considerar a este tipo como una clase de silla. Ahora bien, al partir del concepto genérico de silla estaremos hablando de una subclase. Por tanto, de una clase genérica o mejor llamada clase base, podemos crear subclases y éstas a su vez tener más subclases, así formaremos una jerarquía de clases. Propiedades, Eventos Y Métodos. Hasta ahora hemos hablado de características de los objetos. Bien, en la terminología de la POO, a éstas se les llama propiedades. Por tanto, todos los objetos tienen unas propiedades que los distinguen de otros. Del mismo modo, el mundo real es algo dinámico y, por lo tanto, las cosas, esto es, los objetos, están expuestos a acciones externas y, a pesar de ser inanimados, pueden cambiar su estado dependiendo de esas acciones. Por ejemplo, si nos acostamos sobre Cotecnor • Programación I • Programación Orientada o Objetos 1 respaldo flexible de una silla, éste se echará hacia atrás. Se ha producido una acción, recostarse, y una reacción, echarse hacia atrás el respaldo. En la POO, a las acciones les llamaremos eventos y a las reacciones métodos. Si esto lo aplicamos a la programación, los eventos serán acciones del usuario sobre nuestra aplicación y los métodos eran código asociado a cada evento. Ahora bien, también pueden existir métodos que no respondan a eventos, aunque esto no es del todo preciso, ya que, si responden a una acción, que es la que nosotros realizamos programáticamente a llamar a dicho método. Bien, entonces ya tenemos los elementos con los que vamos a jugar en la POO: las clases, los objetos, las propiedades, los eventos y los métodos. Esto es lo que debemos saber y dominar, ni más ni menos. Clasificación de métodos Los métodos se pueden ratificar en cuatro tipos que son los siguientes: Constructores. Un constructor es el primer método que se ejecuta al realizar la instancia del objeto. Uno de los usos principales de un constructor es la inicialización de los atributos de la clase. Debe tener visibilidad pública y no posee retorno. Consultores. Un consultor es el método que permite retornar al valor de un atributo con visibilidad privada al aplicar el concepto de encapsulamiento. Modificadores. Un modificador es el método que permite asignar valor a un atributo con visibilidad privada al aplicar el concepto de encapsulamiento. Analizadores. Un analizador es el método que permite implementar la lógica del servicio del mismo, es decir, allí se implementan los algoritmos requeridos. Visibilidad La visibilidad se refiere al nivel de accesibilidad de los atributos y métodos. Los niveles de accesibilidad se dan por los siguientes términos: Privado: se puede acceder desde un método implementado desde la misma clase. Público: se puede acceder desde un método implementado en cualquier clase. Protegido: se puede acceder desde un método implementado en una clase que herede la clase que contiene esta visibilidad y desde clases implementadas en el mismo paquete. Objetos del mundo que nos rodea y del mundo informático. Llegado este punto, es fácil que como estudiante encuentre todo esto como un desvarío que poco o nada tiene que ver con la programación y sí mucho con filosofía barata. Pero hagamos ahora una traslación de lo dicho a nuestro mundo. Parece que nos tenemos que dedicar a convertir nuestros programas en poco menos que una colección objetos tales como mesas, coches, árboles, etc. Realmente la POO sí que dice que esto sea así, un ejemplo menos estereotipado sería el objeto artículo, o el objeto cliente, ambos son entidades que tienen unas propiedades y se realizan acciones con ellos. Ahora bien, tan cierto es que estos objetos, como que también nuestro mundo, el informático, tiene objetos. ¿O no lo son, las ventanas, los botones, la lista desplegables…? Todos ellos son elementos que también tienen unas características propias y actúan de diversa forma respecto a los eventos realizados por nuestro opuesto, que no es otro que el usuario final. Por tanto, tal vez sea más fácil, Cotecnor • Programación I • Programación Orientada o Objetos 2 asimilar la POO pensando de objetos de nuestro entorno de programación, de la interfaz, etc. que en algo tan vasto como el entorno vital. Nuestra mente cuadrícula lo agradecerá. Características de la POO Los componentes están vistos, pero que más nos ofrece la POO para que sea útil. Bien, veamos tres fundamentales. mos de todas las posibilidades. Por último, podemos impedir que una propiedad o método heredado pueda ser modificado en algún sitio que no sea la clase de base, esto es lo que se denomina proteger la propiedad o método. Polimorfismo También es una característica propia de la POO y consiste en que varios objetos, aunque partan de distintas clases, tengan métodos o propiedades con el mismo nombre y que actúen de distinta forma. Tiene una relación directa con la herencia, ya que un método o propiedad heredado se puede sobre escribir y por tanto puede actuar de distinta forma o de lo que hacía en la clase base. Herencia Una de las principales ventajas de la POO. La herencia se hace a crear subclases u objetos. Consiste en que éstos tienen las propiedades y métodos que hayamos definido en la clase base, por lo que no tendremos que repetirlos. Aquí aparece una de las razones, la reutilización del código. Nosotros, en la programación estructurada, utilizamos el famoso método de copiar y pegar todo lo que nos sirve de otro programa que tuviéramos hecho. Encapsulación En la POO, hay que poner ese código que nos vale en una clase y, sólo con esto, todas las subclases y objetos que creemos partiendo de esa clase tendrán, sin hacer nada, es el código sin tener por tanto que reescribirlo. Además, cuántas veces hemos tenido que retocar un código por un pequeño error de sintaxis cuando ya la habíamos “pegado” en varios módulos y, por tanto, deberemos modificar en cada uno de ellos. O ese color de ventana que no le gusta el usuario y que hemos empleado en las cuarenta y siete que tiene aplicación, por lo que ahora tenemos que modificarlas una a una. Gracias a la POO ya no tendremos que hacerlo, puesto que la herencia funciona automáticamente, por lo que iremos a la clase base y modificaremos esa propiedad o ese método que estaba mal y voilá, el cambio se reflejará en todas las clases y objetos que se crearon a partir de dicha clase. Sólo por esto, merece la pena programar con orientación a objetos. Claro, que muchas veces va suceder que una determinada propiedad o método no nos sirve. Esto tampoco representa un problema, ya que no estamos obligados a tener que heredarlo, sino que podemos sobreescribir el método o la propiedad en cuestión. Directamente sucederá cuando escribamos en la propiedad o en el método. También podemos utilizar el código heredado y sumarle el propio que nos interese. En fin, dispone- Siguiendo con la dinámica de actuación de la POO, al crear clases lo que estamos haciendo implícitamente es agrupar propiedades y métodos para qué, cuando tengamos que hacer otra aplicación, cojamos esa clase y la pongamos en ellas sin tener que cambiar nada. A esto se le llama encapsulación. En la programación estructurada teníamos código dispersado en módulos, programas, etc., y en la POO todo lo guardamos en el mismo sitio, en la clase u objeto, lo encapsulamos. Si queremos utilizar una propiedad o método debemos llamar al objeto en cuestión mediante mensajes. Los podríamos asociar con las clásicas llamadas a funciones o procedimientos almacenados. La encapsulación, por tanto, ayuda también a la reutilización del código y de hacer más fácil su búsqueda en nuestras aplicaciones. Clases visuales y no visuales Como hemos entrado de lleno en las clases de podemos llamar informáticas, está muy clara la división que se puede hacer. Por un lado, tenemos aquellas clases que se va a convertir en objetos en pantalla y que, por tanto, tienen representación gráfica, son las clases visuales; por otro lado, la que son una colección de propiedades y métodos que no son llamados desde otros objetos pero que no forman parte de la interfaz, son las clases no Cotecnor • Programación I • Programación Orientada o Objetos 3 visuales. • Clases contenedoras • • • De todas estas clases se puede hacer otro tipo de división que viene marcada por aquellas que pueden tener dentro del sí a otras clases. Los objetos contenidos se denomina objetos miembros y automáticamente pasan a depender de su contenedor. Como veremos, se complica bastante el código de nuestros programas, pero va a ser inevitable trabajar con este tipo de clases. Su utilización encapsula aún más el código, ya que permite agrupar objetos. Controles Por último, también se pueden agrupar las clases teniendo en cuenta si debe incluirse obligatoriamente dentro de un formulario para que puedan visualizarse en pantalla. Son objetos dependientes del formulario. Pros y contras de la POO Después de visto todo lo referente a orientación objetos se pueden sacar conclusiones, que deben ser positivas en su mayor parte. La POO nos facilita: • Reutilizar el código • • • • • Modificar, de una sola vez, varias partes de una aplicación Ordenar y agrupar código según su finalidad Analizar con mayor vigor nuestras aplicaciones Adaptar nuestro código a otras aplicaciones, aunque no sean nuestras Encontrar errores más rápidamente Agregar las capacidades y prestaciones Interactuar con el usuario y controlar mejor sus acciones Eliminar redundancias de código Documentar más cómodamente las aplicaciones Sin embargo, no todos son ventajas y nos encontramos con algunos aspectos que no pueden llegar a modificar bastante nuestros hábitos de programación. Así tenemos problemas como: • La herencia no reescribe el código en pantalla, por lo que continuamente debemos ir a las clases padre y a veces no sabemos si algún error está en objeto o en la clase. • La fase de análisis se alarga considerablemente, ya que no podemos sentarnos delante del computador y ponernos a teclear código. • Debemos organizarnos con suma precisión. De lo contrario puede redundar se código en clases distintas o crearse clases distintas para el mismo fin. • Muchas veces se deben incluir más código del necesario en una aplicación, ya que es inseparable de la clase. • Crear muchas subclases puede ralentizar nuestras aplicaciones, por lo que conviene no abusar. Haciendo un balance general y comparándolo con la programación estructurada, podemos decir que seguimos haciendo lo mismo, pero con unas directrices bien definidas. Ahora bien, el que piense que va a obtener resultados, en cuanto a productividad, pocos días, está realmente equivocado. La POO comienza a ser rentable cuando se ha realizado unas cuantas aplicaciones y tenemos verdaderamente código para reutilizar. El número de clases que puede llegar a tener una empresa de desarrollo puede ser inmenso, pero las aplicaciones que se respiran se realizarán en menos tiempo y con más fiabilidad; en definitiva, lo que todos deseamos. Cotecnor • Programación I • Programación Orientada o Objetos 4