Recientes

jueves, 28 de diciembre de 2017

Programación orientada a objetos

La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que utiliza objetos para crear programas informáticos. La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación.
Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación.

Muchos de los objetos pre-diseñados de los lenguajes de programación actuales permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes permiten al usuario la creación de sus propias bibliotecas.

Historia de la programación orientada a objetos

Los conceptos de clase y herencia fueron implementados por vez primera en el lenguaje Simula 67, este fue diseñado en 1967 por Ole-Johan Dhal y Krysten Nygaard en la Universidad de Oslo y el Centro de Computación Noruego.

Aunque Simula fue el padre de los primeros conceptos de programación orientada a objetos, ha sido Smalltalk quién dio el paso definitivo y es éste el que debemos considerar como el primer lenguaje de programación orientado a objetos. Smalltalk fue diseñado en el Palo Alto Research Center (PARC) de Xerox Corporation's, en California. En el centro de investigación de Palo Alto, a comienzos de los 70, el proyecto iniciado por Alan Kay vio la luz con el nombre de Smalltalk.

El último gran paso lo dio Bjarne Stroustrup con la creación del C++, quizás el lenguaje de programación orientado a objetos más usado actualmente. Este, fue definido en 1986 por su autor en un libro llamado The C++ Programming Language, de cita y referencia obligadas cuando se habla de OOP. Tan importante es esta publicación, que cuando se habla de C++, a este libro se le llama "El Libro".  La importancia del C++ radica, en que, abandonando ciertos requerimientos de los lenguajes de cuarta generación con tecnología OOP como son Smalltalk o Actor, ha conseguido darle una gran potencia y flexibilidad al más famoso lenguaje, el C.

Hoy en día, casi todos los lenguajes más usados en los 80 se han reconvertido en mayor o menor medida a la OOP, y han aparecido otros nuevos. Veámoslos rápidamente: C ha pasado a llamarse C++. Es la mejor implementación OOP sobre un lenguaje compilado existente en este momento. Su punto más conflictivo no obstante no su total implementación OOP, sino el hecho de permitir herencia múltiple, lo que, según los teóricos, no es muy aconsejable.

Java es la estrella de los últimos años: es pura OOP, impecablemente concebido e implementado por Sun, y al que sólo se le puede achacar (si es que nos ponemos quisquillosos) que no dispone de sobrecarga de operadores, cualidad que de los citados aquí sólo dispone C++.

Conceptos básicos de la programación orientada a objetos

Estudiaremos los conceptos de Clase, Objeto, Atributo, Estado, Método, Constructor, Destructor, Mensaje y Acceso.  Estas son las ideas más básicas que todo aquel que trabaja en OOP debe comprender y manejar constantemente; es por lo tanto de suma importancia que los entienda claramente.

Clase: Una clase, es simplemente una abstracción que hacemos de nuestra experiencia sensible. El ser humano tiende a agrupar seres o cosas -objetos- con características similares en grupos –clases. Cada clase posee unas cualidades que la diferencian de las otras. Así, por ejemplo, los vegetales se diferencian de los minerales -entre otras muchas cosas- en que los primeros son seres vivos y los minerales no. En OOP existe otro concepto muy importante asociado al de clase, el de "clase abstracta". Una clase abstracta es aquella que construimos para derivar de ella otras clases, pero de la que no se puede instanciar.

Objeto: En POO, un objeto es un conjunto de datos y métodos. Los datos son lo que antes hemos llamado características o atributos, los métodos son los comportamientos que pueden realizar. Lo importante de un sistema OOP es que ambos, datos y métodos están tan intrínsecamente ligados, que forman una misma unidad conceptual y operacional. En OOP, no se pueden desligar los datos de los métodos de un objeto. Así es como ocurre en el mundo real. También podemos decir que un objeto es una instancia de una clase, que es lo mismo a decir que es un caso particular de una clase.

Atributo: Es el conjunto de características, cualidades y propiedades que posee un objeto. Contenedor de un tipo de datos asociados a un objeto, que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. En un lenguaje de programación, los atributos se representan con variables.

Estado: Es estado es el valor que puede tener el atributo de un objeto.

Método: Los métodos son los comportamientos que poseen los objetos. Es un algoritmo asociado a un objeto, cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. En un lenguaje de programación, los métodos se representan con funciones o procedimientos.

Mensaje: Es una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Constructor: Un constructor es una función especial que es miembro de esa clase y que tiene el mismo nombre de la clase. La función de construcción de un objeto se invoca cuando se crea el objeto. Esto significa que se invoca cuando se ejecuta la declaración del objeto. Además, para los objetos locales, el constructor se invoca cada vez que se llega a la declaración del objeto. Como lo dice el nombre, un constructor es una función que se utiliza para construir un objeto de una clase dada. Un constructor tiene el nombre de la clase a la que pertenece.

Destructor: Los destructores entran en la misma categoría que los constructores. Se utilizan para realizar ciertas operaciones que son necesarias cuando ya no se utiliza un objeto como es la liberación de memoria. El destructor se utiliza para cerrar el dispositivo gráfico y rechazar cualquier espacio de memoria asignado al objeto.

Acceso: Los modificadores de acceso indican la visibilidad que una variable o un método tiene. Tanto los distintos tipos posibles, como la palabra reservada para denotarlos dependen, como es lógico, de cada lenguaje. De todos modos, todos los lenguajes OOP incluyen al menos los tres siguientes: Públicos: Son visibles dentro y fuera de la clase sin restricción alguna; Protegidos Estos miembros de la clase son visibles desde dentro de la clase y desde cualquier otra clase heredada, es decir, clases hijas; Privados Lo miembros privados son solo accesibles desde dentro de la clase donde existen.

Características de la programación orientada a objetos

La programación orientada a objetos posee un conjunto de características, que lo hacen ser un paradigma de programación único. Estas características son las siguientes:

Herencia: La herencia es la capacidad que posee un objeto de adquirir las propiedades y comportamientos de otro objeto. La herencia permite reutilizar todo el código escrito para las superclases re-escribiendo solo aquellas diferencias que existan entre éstas y las subclases. Esto quiere decir que en la herencia una clase hija hereda los atributos y métodos de su clase padre. A la clase hija se le llama subclase o clase heredada, mientras que a la clase padre se le llama clase base, superclase o clase de la que se hereda. Al heredar, la clase heredada toma directamente el comportamiento de su superclase, pero puesto que ésta puede derivar de otra, y esta de otra, etc., una clase toma indirectamente el comportamiento de todas las clases de la rama del árbol de la jerarquía de clases a la que pertenece. Se heredan los datos y los métodos, por lo tanto, ambos pueden ser redefinidos en las clases hijas, aunque lo más común es redefinir métodos y no datos.

Encapsulación: Un objeto es como una caja negra, a la que se le envía un mensaje y éste responde ejecutando el método apropiado, el cual producirá las acciones deseadas. Un objeto, una vez programado es solo manipulable a través de mensajes. A este intrínseco vínculo entre datos y métodos y al modo de acceder y modificar sus datos es a lo que llamamos Encapsulación. Gracias a la encapsulación, una clase, cuando ha sido programada y probada hasta comprobar que no tiene fallos, podemos usarla sin miedo a que al programar otros objetos estos puedan interferir con los primeros produciendo efectos colaterales indeseables que arruinen nuestro trabajo.

Polimorfismo: Por polimorfismo entendemos aquella cualidad que poseen los objetos para responder de distinto modo ante el mismo mensaje. Pongamos por ejemplo las clases hombre, vaca y perro, si a todos les damos la orden -enviamos el mensaje- Come, cada uno de ellos sabe cómo hacerlo y realizará este comportamiento a su modo. Realmente, y para ser exactos, los mensaje no se envían a las clases, sino a todos o algunos de los objetos instanciados de las clases. El polimorfismo nos facilita el trabajo, ya que gracias a él, el número de nombres de métodos que tenemos que recordar disminuye ostensiblemente. En el polimorfismo entra la sobrecarga, que es la creación de varios métodos que poseen el mismo nombre, pero que difieren en los parámetros que reciben.

Abstracción: Denota las características 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 "cómo" se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos, y, cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

Modularidad: Se denomina "modularidad" a la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos.

Conclusión

La POO es un paradigma surgido en los años 1970, que utiliza objetos como elementos fundamentales en la construcción de la solución. Un objeto es una abstracción de algún hecho o ente del mundo real, con atributos que representan sus características o propiedades, y métodos que emulan su comportamiento o actividad. Todas las propiedades y métodos comunes a los objetos se encapsulan o agrupan en clases. Una clase es una plantilla, un prototipo para crear objetos; en general, se dice que cada objeto es una instancia o ejemplar de una clase.