POO


¿Qué es la programación orientada a objetos?


Es un paradigma de la programación de computadores que tiene como objetivo el desarrollo computacional basado en una colección de objetos que están interrelacionados y trabajan conjuntamente para resolver un problema. Surge dentro de los paradigmas de la programación como un enfoque diferente al momento de obtener soluciones computacionales.
Historia
La programación orientada a objetos (POO) nace en los años 60's en el Norwegian Computing Center con la implementación de dos lenguajes de programacion de simulacion: Simula 1 y Simula 67, desarrollados por Kristen Nygaard y Ole Johan Dahl. Simula 67 introdujo por primera vez los conceptos de clases, objetos, herencia, subclases, corrutinas y funciones virtuales. Es por esta razón que Simula es considerado el primer lenguaje orientado a objetos.





Photo

Programa "Hola Mundo" en Simula 67:

Photo

El mensaje está codificado en el bloque de código de la clase Saludos. Este bloque de código se ejecuta solamente cuando existe una instancia o variable de tipo Saludos, lo que ocurre efectivamente al crear una instancia por medio de la instrucción New. En Simula, los objetos siempre son manejados por medio de referencias. Existe un recolector de basura que se encarga de eliminar de la memoria los objetos que se han quedado sin referencias a ellos. Una de estas referencias la vemos con variable objeto. Utilizamos el operador :- para asignar referencias. A diferencia de muchos lenguajes modernos, Simula entiende de dos tipos de objetos:

  • Activos: Son aquellos objetos que aún no han completado su bloque asociado begin/end.
  • Inactivos: Son aquellos que han completado su bloque de instrucciones

Tanto de unos como de otros, es posible ejecutar los procedimientos miembro y consultar los atributos en cualquier momento.



Evolución
Photo


Años después del desarrollo de Simula 67 casi todos los lenguajes de programación modernos comenzaron a utilizar los principios de orientación a objetos. Así fue como se popularizaron términos como clases, objetos, instancias, herencia, polimorfismo, etc. Un ejemplo significativo fue el nacimiento del lenguaje Java, uno de los lenguajes orientados a objetos con mayor reconocimiento a nivel mundial.


Ventajas
  • Una buena abstracción de las clases, objetos y atributos nos brinda una implementación más detallada, puntual y coherente.
  • Reutilización de código: Cuando se han diseñado adecuadamente las clases, se pueden usar en distintas partes del programa y en numerosos proyectos (herencia). Lo cual pemite:
    • Rápido desarrollo.
    • Alta calidad del código.
    • Bajo costo en fases de desarrollo.
  • Modificabilidad: La facilidad de añadir o suprimir nuevos objetos nos permite hacer modificaciones de una forma muy sencilla.
  • Encapsulamiento: Nos permite proteger la integridad de los datos.
  • Fiabilidad: Al dividir el problema en partes más pequeñas podemos probarlas de manera independiente y aislar mucho más fácilmente los posibles errores que puedan surgir.
  • Bajo acoplamiento y alta cohesión: Las clases son independientes entre sí, y hacen las tareas específicas para las cuales fueron diseñadas.
  • Beneficios de diseño
  • Mantenimiento de software
  • Amplia documentación


Como se puede visualizar en la imagen, si se hace un buen diseño y una abstracción adecuada, se pueden generar diferentes módulos a partir de una clase base. En este ejemplo, la clase Figura brinda la posibilidad de crear muchas más formas geométricas como el círculo, el rombo, la estrella, el polígono y demás mediante su extensión.


Desventajas
  • Curva de aprendizaje: La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y entrenamiento.
  • La ejecución de programas orientados a objetos es más lenta.
  • e hereda código que no se usa en la clase hija cuando se extiende de una clase padre.
  • Tiempo en fase de diseño.
  • Tamaño del programa.
Lenguajes de programación

Un lenguaje de programación es orientado a objetos si cumple con las siguientes condiciones: 
  • Soporta objetos que son abstracciones de datos con una interfaz de operaciones con nombre y un estado local oculto.
  • Los objetos tienen un tipo asociado (la clase).
  • Los tipos (clases) pueden heredar atributos de los supertipos (superclases).

Algunos de los lenguajes que son orientados a objetos son los siguientes:

  • ActionScript
  • C++
  • C#
  • Java
  • Objetive-C
  • Perl
  • PHP
  • Python
  • Ruby
  • Smalltalk
  • SCALA






La programación orientada a objetos


La programación orientada a objetos o POO es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas de computadoras. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento.

Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. En la POO las entidades centrales son los objetos, que son tipos de datos que encapsulan con el mismo nombre estructuras de datos, operaciones o algoritmos que manipulan esos datos.

Objeto: Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos) 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.

Podemos distinguir varias propiedades:



Propiedades


ABSTRACCIÓN: Es la propiedad que permite representar las características esenciales de un objeto sin preocuparse de las restantes características. Se centra en la vista externa de un objeto de modo que sirve para separar el comportamiento esencial de un objeto, de su implementación.


ENCAPSULAMIENTO: Es la propiedad que permite asegurar que el contenido de la información de un objeto esta oculta al mundo exterior, es decir el objeto A no conoce lo que hace el objeto B y viceversa. La encapsulación permite la división de un programa en módulos, esos módulos se implementan mediante clases, de forma que una clase representa la encapsulación de una abstracción.


MODULARIDAD: Es 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 si y de las partes restantes.


JERARQUIA: Es la propiedad que permite una ordenación de las abstracciones, las dos jerarquías más importantes de un sistema complejo son: 
  • Estructuras de clases
  • Estructuras de objetos


Fuente:
http://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/index.html http://es.slideshare.net/NesMey/paradigma-orientado-a-objetos-4954115 http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)