# Programación orientada a objetos

> Organizar el código en objetos que juntan datos con las acciones que los usan.

- Nivel: Intermedio
- Temas: Software
- URL: https://tidbit.legios.com.ar/es/object-oriented-programming/
- En inglés: [Object-oriented programming](https://tidbit.legios.com.ar/object-oriented-programming/)

La **programación orientada a objetos**, o POO, es una forma de organizar el código alrededor de **objetos**. Un objeto junta ciertos datos con las funciones que trabajan sobre ellos. Un objeto `Customer` puede guardar un nombre y un email y saber cómo hacer `sendInvoice()`. La **clase** es el molde: escribís la clase `Customer` una vez y creás miles de objetos cliente a partir de ella.

Casi siempre vienen tres ideas con ella. **Encapsulamiento**: un objeto esconde sus tripas y muestra solo lo que los demás necesitan, así podés cambiar lo de adentro sin romper el resto. **Herencia**: una clase puede extender a otra, entonces un `PremiumCustomer` reutiliza todo lo de `Customer` y le agrega un descuento. **Polimorfismo**: objetos distintos pueden responder al mismo pedido a su manera, así el código llama a `pay()` sin importarle si es una tarjeta o una transferencia.

La POO nació con lenguajes como Simula y Smalltalk en los 60 y 70, y se volvió masiva con C++ y después con Java. Java, C#, Python y Swift se apoyan en ella. No es el único estilo: la programación funcional, que prefiere datos simples y funciones sin estado escondido, ganó terreno, y la mayoría de los lenguajes modernos mezclan los dos. Abusar de la herencia es una forma clásica de terminar con código difícil de cambiar.

## Una analogía

Una fábrica de autos. El plano es la clase, cada auto que sale de la línea es un objeto, y manejás cualquiera con los mismos pedales y el mismo volante sin saber cómo está hecho el motor.

## Para quedarse

- Un objeto junta datos con las funciones que actúan sobre ellos.
- La clase es el molde; los objetos son las instancias que salen de él.
- Encapsulamiento, herencia y polimorfismo son las ideas centrales.
- Java, C#, Python y Swift son orientados a objetos; la mayoría de los lenguajes mezclan estilos.

## Para seguir leyendo

- [Programación orientada a objetos en Wikipedia](https://es.wikipedia.org/wiki/Programación_orientada_a_objetos)
- [OOP (glosario de MDN)](https://developer.mozilla.org/es/docs/Glossary/OOP)

## Términos relacionados

- [C y C++](https://tidbit.legios.com.ar/es/c-and-cpp/): Dos lenguajes veteranos y rápidos debajo de sistemas operativos, navegadores y juegos.
- [Java](https://tidbit.legios.com.ar/es/java/): Un lenguaje veterano que mueve bancos, sistemas de grandes empresas y Android.
- [Python](https://tidbit.legios.com.ar/es/python/): Un lenguaje de programación muy usado, conocido por ser fácil de leer y de escribir.
- [Swift](https://tidbit.legios.com.ar/es/swift/): El lenguaje de programación de Apple para hacer apps de iPhone, Mac y sus otros equipos.
- [Stateless y stateful](https://tidbit.legios.com.ar/es/stateless-and-stateful/): Si un programa recuerda cosas entre un pedido y otro, o guarda esa memoria en otro lado.
