|
Al comenzar esta parte del curso, “Programación Orientada a Objetos” (POO), uno de los primeros conceptos que me vienen a la mente es el de programación. Se llama programación a la creación de un programa de computadora, el cual es un conjunto concreto de instrucciones que una computadora puede ejecutar. El programa se escribe en un lenguaje de programación, aunque también se pueda escribir directamente en lenguaje de máquina, con cierta dificultad. Un programa se puede dividir en diversas partes, que pueden estar escritas en lenguajes distintos.
Para diferenciar, Software es el sustantivo que denomina a los programas y datos de computadora, mientras que un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) un algoritmo. Puede haber programas que no se ajusten a un algoritmo (pueden no terminar nunca), en cuyo caso se denomina procedimiento a tal programa.
La programación de ordenadores debe perseguir tres objetivos fundamentales:
-
Corrección: Un programa es correcto si hace lo que debe hacer. Para determinar si un programa hace lo que debe es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y una vez acabado compararlo con lo que realmente hace.
-
Claridad: Es muy importante que el programa sea lo más claro posible y legible posible para mejorar el mantenimiento del software. Cuando se acaba de escribir el código del programa, se deben buscar errores y corregirlos. Más concretamente, cuando el programa está concluido, es necesario hacerle ampliaciones y/o modificaciones, según la demanda de los usuarios, esta labor puede ser llevada acabo por el mismo programador que implementó el programa o por otros.
-
Eficiencia: Debe consumir la menor cantidad de recursos posible. Normalmente al hablar de eficiencia se suele hacer referencia al consumo de tiempo y/o memoria.
Para lograr estos puntos, es necesario utilizar utilizar una metodología de programación.
Entonces, lo primero que nos preguntaremos es qué se entiende por metodología de la programación. Para ello, lo más directo es acudir al DRAE (Diccionario de la Real Academia de la Lengua) donde se define:
Metodología:
- Ciencia del método.
- Conjunto de métodos que se siguen en una investigación científica o en una exposición doctrinal.
Así pues aplicado al campo de la programación sería el conjunto de métodos, herramientas que nos sirven para desarrollar programas. Cuando hablamos de herramientas nos estamos refiriendo tanto a aquellos elementos simples que nos encontramos en cualquier lenguaje de programación (tipos de datos, estructuras de control, etc) como el estudio de técnicas (algoritmos voraces, divide y vencerás, etc.) para el diseño de algoritmos. Estudio que se realiza atendiendo a criterios de eficiencia y corrección.
El desarrollo de programas ha sufrido una evolución desde los primeros sistemas de cálculo, implementados en grandes computadores. Aquellos sistemas enfocaban todo el esfuerzo de desarrollo en la escritura de programas que realizaban todo tipo de cálculo. Desde entonces han surgido dos grandes cambios. El primero, la aparición del modelo relacional, modelo con una fuerte base algebraica, que supuso el desarrollo y estructuración de las bases de datos. El segundo, sobre los lenguajes de programación fue la aparición de los Lenguajes orientados a objetos. La escritura de programas pasa a ser una tarea no sólo de codificación algorítmica sino también una tarea de estructuración del problema, en el que la abstracción y modelado de objetos juega un papel importante.
Esta parte del curso tiene como objetivo introducirnos en el paradigma de la programación orientada a objetos. De esta forma seremos capaces de realizar programas fácilmente mantenibles, modificables y reusables. Cuando se escribe un programa en un lenguaje orientado a objetos, se define una plantilla o clase que describe las características y el comportamiento de un conjunto de objetos similares. La clase automóvil describe las características comunes de todos los automóviles: sus atributos y su comportamiento. Los atributos o propiedades se refieren a la marca o fabricante, el color, las dimensiones, si tienen dos, tres, cuatro o más puertas, la potencia, si utiliza como combustible la gasolina o gas, etc. El comportamiento se refiere a la posibilidad de desplazarse por una carretera, frenar, acelerar, cambiar de marcha, girar, etc.
Luego, tenemos automóviles concretos, por ejemplo el automóvil propio de una determinada marca, color, potencia, etc., el automóvil del vecino de otra marca, de otro color, etc., el automóvil de un amigo, etc.
Una clase es por tanto una plantilla implementada en software que describe un conjunto de objetos con atributos y comportamiento similares.
Una instancia u objeto de una clase es una representación concreta y específica de una clase y que reside en la memoria del ordenador.
Fundamentos de programación
Un lenguaje de programación es, como todo lenguaje en general, un dialecto; o sea un conjunto de convenciones utilizadas para comunicarse. De este modo, a través de un dialecto que con el tiempo ha ido evolucionando y mejorando, incluso volviéndose mas amigable a la comprensión humana, es la forma en que el hombre se comunica con las máquinas. Hace mucho tiempo atrás el término programación se refería a una codificación lineal absolutamente críptica y misteriosa; hoy en día, con el desarrollo de las interfaces gráficas de usuario, más la evolución de los lenguajes que se han tornado muchísimo mas amigables y a su vez mas potentes, esto se presenta de una forma muy diferente y ya no tan compleja.
Un programa tradicional, que sigue el paradigma estructurado, se basa fundamentalmente en la ecuación de Wirth:
Algoritmos + Estructuras de Datos = Programas
Esta ecuación se interpreta como que los algoritmos y los datos se tratan por separado. De esta forma las funciones o procedimientos que tratan estos datos los van procesando y pasando de unos a otros hasta obtener el resultado deseado.
La programación orientada a objetos gira entorno al concepto de objetos. Así un objeto es una entidad que tiene unos atributos particulares, los datos, y unas formas de operar sobre ellos, los métodos o procedimientos. Durante la ejecución, los objetos reciben y envían mensajes a otros objetos para realizar las acciones requeridas.

Esta definición resulta incompleta, pues se trata la definición de un TAD (Tipo Abstracto de Datos). Un TAD encapsula un tipo definido por el usuario junto con las operaciones sobre estos datos, realizando un proceso de abstracción, en el que se trata de ocultar los detalles y agrupar características comunes para facilitar su uso y comprensión. La diferencia entre el concepto de TAD y el de objeto radica en que además del proceso de abstracción que se utiliza para su definición, existen otros dos con los que se forma el núcleo principal de la programación orientada a objetos, la herencia y el polimorfismo. Atributos Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
Comportamiento
El comportamiento de los objetos de una clase se implementa mediante funciones miembro o métodos. Un método es un conjunto de instrucciones que realizan una determinada tarea y son similares a las funciones de los lenguajes estructurados.
Del mismo modo que hay variables de instancia y de clase, también hay métodos de instancia y de clase. En el primer caso, un objeto llama a un método para realizar una determinada tarea, en el segundo, el método se llama desde la propia clase.
La programación orientada a objetos
La llegada al mundo de la programación del concepto de objetos, revolucionó la historia de la misma; se introdujeron al lenguaje diario de los profesionales del área, conceptos tales como herencia, polimorfismo, etc., que hicieron que el modo de pensar y concebir el desarrollo de una aplicación fuera muy diferente a lo que había sido hasta ese momento con la programación lineal o estructurada.
Java ha ofrecido la implementación del uso de objetos, desde la versión 1.0.
En la programación orientada a objetos tenemos dos elementos fundamentales, las CLASES y los OBJETOS, podemos definir a la clase como la generalización de los objetos y los objetos como la concreción de la clase, con el correr de este curso podremos entender más claramente esta engorrosa definición que más parece un juego de palabras.
Esta metodología, como se mencionó antes, gira en torno a términos tales como abstracción, encapsulamiento, herencia y polimorfismo; para poder comprender lo que la POO (programación orientada a objetos) significa, tenemos que tener estos términos claros, así que pasamos a ver qué hay detrás de estos conceptos.
Hemos mencionado las cuatro características básicas que debe cumplir un objeto para denominarse como tal, pilar fundamental de la programación orientada a objetos. Cuando hablamos de un objeto, hablamos de pequeños elementos bien definidos, representaciones verdaderas de objetos que tenemos en la vida real, mediante el uso e implementación de la metodología de “Programación Orientada a Objetos” intentamos crear objetos de software que tengan correlación con los objetos del mundo real en la solución que intentamos implementar, o sea, en un módulo de facturación de un sistema de gestión comercial, vamos a crear nuestro objeto FACTURA, que tendrá relaciones con nuestro objeto CLIENTE, y PRODUCTO, la aplicación de esta concepción de trabajo es la que nos permiten aislar cada componente del resto de la aplicación y de esa forma aprovechar en mayor medida nuestro esfuerzo, nuestra concentración en el buen funcionamiento de dichos componentes, nuestro control sobre ellos, más prolijidad en la codificación y por sobre todas las cosas, REUTILIZAR EL CODIGO escrito.
Definido lo que es un objeto, ahora además sabemos cuáles son sus cuatro características principales y necesarias para denominarse como tal, vamos al detalle de lo que cada una de ellas significa.
Abstracción:
Es la capacidad de un objeto de cumplir sus funciones independientemente del contexto en el que se lo utilice; o sea, un objeto “cliente” siempre expondrá sus mismas propiedades y dará los mismos resultados a través de sus eventos, sin importar el ámbito en el cual se lo haya creado.
Encapsulamiento:
Esta característica es la que denota la capacidad del objeto de responder a peticiones a través de sus métodos sin la necesidad de exponer los medios utilizados para llegar a brindar estos resultados. O sea, el método MostrarSaldo() del objeto “cliente” antes mencionado, siempre nos va a dar el saldo de la cuenta de un cliente, sin necesidad de tener conocimiento de cuáles son los recursos que ejecuta para llegar a brindar este resultado.
Herencia:
Es la característica por la cual los objetos para su creación se basan en una clase de base, heredando todas sus propiedades, métodos y eventos; los cuales a su vez pueden o no ser implementados y/o modificados.
Polimorfismo:
El término de polimorfismo define la capacidad de que más de un objeto puedan crearse usando la misma clase de base para lograr dos conceptos de objetos diferentes, en este caso podemos citar el típico ejemplo de los teléfonos, los cuales se basan en un teléfono base, con la capacidad de hacer ring y tener un auricular, para luego obtener un teléfono digital, inalámbrico, con botonera de marcado y también, tomando la misma base, construir un teléfono analógico y con disco de marcado.
EJEMPLOS
¿Qué es un objeto? Objeto es el concepto clave de la Programación Orientada a Objetos, la idea de objeto es similar a la del mundo real, un objeto puede ser una silla, una mesa. Tu perro es un objeto.
Los objetos tienen dos características: Un estado y un comportamiento. Fijate que por ejemplo tu perro tiene un estado: nombre, color, raza, altura, etc. y un comportamiento: ladrar, cavar pozo, llorar, dormir, comer, etc.
Un auto es un objeto. También tiene un estado: Cantidad de puertas, color, tamaño, etc. y un comportamiento: acelerar, frenar, subir cambio, bajar cambio, girar izq., girar der., etc.
Entonces podemos definir a un objeto en POO, como un conjunto de datos y funciones relacionadas. A las funciones de los objetos, tales como acelerar en el caso del auto, de aquí en más las llamaremos métodos, a los datos los llamaremos atributos.
Los objetos en programación, son modelados observando objetos del mundo real, por ejemplo implementamos el objeto "perro" dentro de nuestro programa definiendo los atributos y métodos del objeto perro real.
El objeto "Auto" se puede representar gráficamente como sigue:
Un ejemplo mas complicado de un objeto podría ser el siguiente:
Objeto: Cuenta bancaria
Atributos: tipo, titular, saldo.
Métodos: Depositar, Extraer.
Aquí se ve la necesidad de que el atributo "saldo" sea solo accesible a través de los métodos "Depositar" y "Extraer" por una cuestión de seguridad, encapsulamiento y para evitar comportamientos indeseados.
¿Qué es una clase?
Una clase es algo abstracto que define la "forma" del objeto, se podría hablar de la clase como el molde de los objetos.
En el mundo real existen objetos del mismo tipo, por ejemplo tu bicicleta es solo una mas de todas las bicicletas del mundo. Entonces diríamos que tu bicicleta es una instancia de la clase "Bicicleta". Todas las bicicletas tienen los atributos: color, cantidad de cambios, dueño y métodos: acelerar, frenar, pasar cambio, volver cambio.
Las fabricas de bicicletas utilizan moldes para producir sus productos en serie, de la misma forma en POO utilizaremos la clase bicicleta (molde) para producir sus instancias (objetos).
Los objetos son instancias de clases.
Ejemplo: Podríamos tener la clase Perro, una instancia de esta clase podría ser el objeto perro llamado "Chicho". La clase Perro especificaría que todos los perros tendrían un nombre, color de pelo, una altura. Mientras que la instancia "Chicho" contendrá valores específicos para cada uno de estos atributos.
Podemos definir a una clase como una plantilla que define variables y métodos comunes para todos los objetos de cierto tipo.
Existe un lenguaje de modelado llamado UML mediante el cual podemos representar gráficamente todo un sistema orientado a objetos utilizando rectángulos, líneas y otro tipo de símbolos gráficos. Según UML, la clase "Cuenta Bancaria" antes mencionada se representará gráficamente como sigue:
Mensajes
Un objeto por si solo no tiene mucho significado. Ejemplo: el objeto "bicicleta" no tiene mucho sentido si no interactúa con un objeto "persona" que pedalee.
La interacción entre objetos se produce mediante mensajes. Los mensajes son llamados a métodos de un objeto en particular.
Podemos decir que el objeto persona envía el mensaje "girar a la izquierda" al objeto bicicleta.
Los mensajes pueden contener parámetros. Por ejemplo teniendo un método en la clase bicicleta llamado "Girar" que recibe como parámetro la dirección (derecha o izquierda).
Un mensaje esta compuesto por los siguientes tres elementos:
- El objeto destino, hacia el cual el mensaje es enviado
- El nombre del método a llamar
- Los parámetros solicitados por el método
Beneficios de los mensajes
Como todo lo que un objeto puede hacer esta expresado mediante métodos, el envío de mensajes soporta todas las posibles interacciones entre objetos.
Para enviar o recibir mensajes, los objetos no necesitan formar parte del mismo proceso, ni siquiera de la misma máquina.
Herencia
Los sistemas orientados a objetos permiten definir clases en término de otras clases. Por ejemplo ovejero alemán y caniche son diferentes razas de perros. En la terminología orientada a objetos "Ovejero Alemán" y "Caniche" son subclases de la clase perro. De forma similar Perro es la superclase de "Ovejero Alemán".
Entonces tenemos la siguiente jerarquía de clases:
En UML se representa la relación de herencia mediante una flecha.
Cada subclase hereda los atributos de la superclase. Tanto la clase "Ovejero Alemán" como "Caniche" tendrán los atributos nombre, color de pelo, altura definidos en la clase Perro.
Una subclase no esta limitada únicamente a los atributos de su superclase, también puede tener atributos propios, o redefinir algunos definidos anteriormente en la superclase.
No se esta limitado tampoco a un solo nivel de herencia, se pueden tener todos los que se consideren necesarios.
Ejemplo:
Clase Empleado hereda de clase Persona, y esta a su vez hereda de clase Animal.
Las subclases proveen un comportamiento especializado sobre los elementos comunes provistos por las superclases. Gracias a la herencia, los programadores pueden rehusar código una y otra vez.
VENTAJAS Y DESVENTAJAS

No todo es color de rosa en la programación orientada a objetos; si bien hemos mencionado ventajas en cuanto a su utilización, como hemos mencionado al comienzo de este capitulo esta metodología de trabajo cambia completamente el enfoque del desarrollo de los procedimientos de codificación hacia el diseño y definición de clases.
Debido a lo que mencionamos recientemente, el hecho de que los objetos son módulos completos de código, pequeños, de alta mantenibilidad y absolutamente independientes del contexto en el que se utilicen, nos brinda la posibilidad de poder trabajar en un equipo de desarrolladores que solo trabajen sobre clases de objetos, sobre las cuales los desarrolladores de aplicaciones se basarán para personalizar sus funcionalidades heredando las bases y luego reunirlas todas en una solución final.
Como vemos, éste fue un claro ejemplo de lo que es la reutilización de código, la programación orientada a objetos nos permite trabajar sobre una biblioteca de clases personalizadas que luego utilizaremos como base de nuestros futuros desarrollos.
Todas estas ventajas al momento de codificar y producir, tienen en contrapartida un gran esfuerzo al momento del diseño de los mencionados objetos, esto requiere de un exhaustivo trabajo de análisis que requiere también de mucha disciplina para que los resultados sean exitosos y no una completa catástrofe.
También debemos destacar que la depuración de código orientado a objeto es algo más compleja que la depuración de código estructurado. Esto no quiere decir que nuestro código vaya a ser peor o tener más errores, pero sí es cierto que en el caso de producirse un error deberemos recorrer todo el árbol de herencia para encontrarlo, algo que en programación estructurada no tenemos que hacer.
Tarea 1:
Describir las características vista en clase de un grupo de objetos de nuestro uso común.
|