Conceptos de la Programación Orientada a Objetos (POO)
La Programación Orientada a Objetos (POO) es un paradigma que organiza el software en torno a objetos en lugar de en torno a funciones y datos separados. Frente a la programación estructurada tradicional, que separa los datos de los procedimientos y busca esencialmente el procesamiento de unos datos de entrada para obtener otros de salida, la POO une datos y comportamiento en una misma entidad. Esa es la diferencia esencial entre ambos enfoques: la programación estructurada separa datos y procedimientos, mientras que la POO los agrupa en objetos.
El objeto: identidad, estado y comportamiento
Un objeto es la abstracción de un dato y su comportamiento. Todo objeto queda definido por tres componentes:
-
Identidad: propiedad que diferencia al objeto de todos los demás, incluso de otros con el mismo estado. Es lo que lo hace único.
-
Estado: los valores concretos de sus datos en un momento dado.
-
Comportamiento: las operaciones que puede realizar.
Así, la definición de un objeto se compone de identidad, comportamiento y estado. Los datos internos del objeto se denominan atributos (las propiedades del objeto), y las operaciones se implementan mediante métodos.
Un método es un algoritmo asociado a un objeto cuya ejecución se desencadena tras la recepción de un "mensaje"; dicho de otro modo, es una función que se ejecuta cuando se invoca sobre un objeto. Un caso particular es el constructor, un método especial que define el proceso de creación de un objeto. El acto de crear un objeto concreto a partir de su plantilla se llama instanciación, cuyo propósito es crear nuevos objetos fácilmente.
La clase
Una clase es una plantilla o molde en la que se definen los atributos y métodos predeterminados de un tipo de objeto. Los objetos son instancias de una clase.
Pilares y características de la POO
-
Abstracción: proceso que consiste en reconocer y enfocarse en las características importantes de una situación u objeto y filtrar o ignorar los detalles no esenciales. Permite al diseñador centrarse en los detalles esenciales de un componente sin preocuparse por los de nivel inferior, y seleccionar características relevantes para definir nuevos tipos de entidades.
-
Encapsulamiento (encapsulación): proceso que oculta los detalles internos de un objeto del mundo exterior, actuando como una barrera protectora. Permite además reunir todos los elementos que pertenecen a una misma entidad al mismo nivel de abstracción. Combinado con la ocultación y la abstracción, mejora la legibilidad del código y facilita el trabajo en grupo.
-
Modularidad: permite dividir o subdividir una aplicación en partes más pequeñas, cada una lo más independiente posible. Al implementarla deben seguirse dos conceptos clave: bajo acoplamiento y alta cohesión.
-
Herencia: una clase (subclase o clase derivada) puede heredar atributos y métodos de otra (superclase o clase padre).
-
Polimorfismo, sobrecarga y ocultación de información completan el modelo.
Un dato importante: la recursividad NO es una característica del paradigma orientado a objetos (es una técnica algorítmica general).
Niveles de acceso (ocultación de información)
Los atributos y métodos pueden declararse con distintos niveles de visibilidad:
-
public: accesible desde cualquier parte.
-
private: solo accesible desde la propia clase. Su fin es evitar que el usuario de la clase pueda cambiar su estado de manera imprevista e incontrolada.
-
protected (protegido): se usa cuando una clase tendrá clases que deriven de ella (herencia) y las clases hijas necesitan acceder a los atributos de la clase padre.
El nivel delegate NO existe como nivel de acceso.
Para que un lenguaje sea considerado orientado a objetos debe soportar objetos, que estos tengan un tipo o clase asociado, y que dichas clases puedan heredar atributos de una clase superior o superclase.
Corrientes de la POO
| Corriente | Base |
|---|---|
| Basada en clases | Se construye una estructura molde llamada clase; los objetos se instancian de ella (Java, C#, Smalltalk). |
| Basada en prototipos | Se usan objetos prototípicos como plantillas a partir de las cuales otros objetos obtienen sus propiedades iniciales. Ejemplo canónico: JavaScript (que NO es un lenguaje basado en clases). |
| Basada en estructuras | Se construyen tipos definidos por el usuario llamados estructuras (struct) y se añade una variable de tipo puntero a las funciones o métodos de esa estructura. Ejemplo: Go. |
Historia
Simula es considerado el primer lenguaje que posee las características principales de un lenguaje orientado a objetos. No obstante, el lenguaje que más influyó en el desarrollo de la teoría de la POO fue Smalltalk, considerado el ejemplo canónico con el que se ha desarrollado gran parte de dicha teoría.
Lenguajes orientados a objetos
-
Puros / principalmente OO: Java, C#, Python, Ruby, Smalltalk, Swift, PHP.
-
Los dos más utilizados actualmente: C# y Java.
-
Enfocados a desarrollo web: Python, PHP y Ruby.
-
ABAP: empleado principalmente en sistemas empresariales (SAP).
-
ADA: utilizado en aplicaciones de defensa y líneas aéreas.
-
C: NO es orientado a objetos.
-
C++: originalmente no orientado a objetos, pero fue extendido para soportar el paradigma.
Ventajas
-
Facilidad de mantenimiento y modificación de los objetos existentes.
-
Gestión de errores: se sabe exactamente dónde mirar cuando se produce un error.
-
Trabajo en grupo más sencillo gracias al encapsulamiento.
-
Su estructura modular no revela el mecanismo detrás del diseño (ocultación).
Inconvenientes
-
No hay una forma única de resolver los problemas, lo que requiere documentación amplia para determinar la solución planteada.
-
Limitaciones del programador: si desconoce las características del paradigma, puede seguir usando el paradigma estructurado en lugar del orientado a objetos.
-
Curva de aprendizaje: exige un cambio en la forma de pensar de la programación tradicional a la orientada a objetos.
-
Velocidad: la ejecución de programas orientados a objetos suele ser más lenta.
Fuentes
-
Wikipedia (EN) — Object-oriented programming: https://en.wikipedia.org/wiki/Object-oriented_programming
-
Carnegie Mellon University — OO History: Simula and Smalltalk (15-214): https://www.cs.cmu.edu/~charlie/courses/15-214/2014-fall/slides/25-history-oo.pdf
-
The Go Programming Language — Methods (receivers value/pointer): https://go.dev/tour/methods/8
-
MDN Web Docs — Inheritance and the prototype chain (JavaScript): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain