viernes, 5 de julio de 2019

Programación Orientada a Objetos

¿Que es la programación orientada a objetos?



La programación orientada a objetos (POO) es un paradigma de programación basada en la interpretación de los elementos como objetos con atributos y otra propiedades.

El uso de este paradigma se popularizó a principios de la década de 1990. Actualmente existen distintos lenguajes de programación orientados a objetos, entre ellos:
  • Java
  • C++
  • Objective C
  • Ruby
  • Python
  • Smalltalk
  • Eiffel
  • Perl
  • Visual .net
  • PHP
  • etc
Algunos de los conceptos fundamentales de la POO:
  • Clase: Es la definición de las propiedades y comportamiento de un tipo de objeto en concreto.
  • Instanciación: Es la creación de un objeto a partir de una clase.
  • Herencia: Es la propiedad mediante la cual una clase puede heredar atributos y operaciones de otra.
  • Objeto: Es la instancia de una clase. Esta entidad es provista de las propiedades y atributos definidos en la clase a la que pertenece.
  • Método: Es un algoritmo asociado a un objeto, cuya ejecución se inicia tras la recepción de un mensaje o invocación. Por decirlo de otro modo es "lo que el objeto puede hacer". En un método se puede realizar un cambio en las propiedades del objeto o invocar otro método.
  • Evento: Es un suceso en el sistema.
  • Atributos: Características que pertenecen a la clase.
  • Mensaje: Es una comunicación dirigida a un objeto, que le ordena ejecute uno de sus métodos con ciertos parámetros asociados a dicho evento.
  • Propiedad o atributo: Es un contenedor de un tipo de dato asociado a un objeto, que permite acceder a los datos fuera del objeto y se define como sus características predeterminadas, y cuyo valor puede ser alterado por medio de un método.
  • Estado interno: Es una variable que se declara privada, y que solamente puede ser accedida y alterada por un método del objeto, no es visible al programador que maneja una instancia de la clase. 

Las características más importantes de la POO son:

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. El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstracción es clave en el proceso de análisis y diseño 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 todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión (diseño estructurado) de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.

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 invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia
Las clases no se encuentran aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. 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 en clases, y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase, se dice que hay herencia múltiple; siendo de alta complejidad técnica por lo cual suele recurrirse a la herencia virtual para evitar la duplicación de datos.

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. Al igual que la encapsulación, los lenguajes soportan la modularidad de diversas formas.

Principio de ocultación
Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una "interfaz" a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas; solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no puedan cambiar el estado interno de un objeto de manera inesperada, 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 abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Recolección de basura
La recolección de basura (garbage collection) es la técnica por la cual el entorno de objetos se encarga de destruir automáticamente, 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 asignación o liberación de memoria, ya que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para soportar el Paradigma de Programación Orientada a Objetos como C++ u Object Pascal, esta característica no existe y la memoria debe desasignarse expresamente.

Referencias:


No hay comentarios:

Publicar un comentario