# Conceptos Claves

## Definiciones

### Principios Fundamentales

La programación orientada a objetos se rige por varios principios fundamentales:

1. **Abstracción:** La abstracción consiste en identificar las características esenciales de un objeto del mundo real y representarlas de manera simplificada en el código. Permite centrarse en los aspectos relevantes de un objeto mientras se ignoran los detalles innecesarios.

2. **Encapsulamiento:** El encapsulamiento implica ocultar los detalles de implementación de un objeto y exponer solo una interfaz pública. Esto permite que el objeto controle cómo se accede y modifica su estado interno, lo que mejora la seguridad y la modularidad del código.

3. **Herencia:** La herencia es un mecanismo que permite crear nuevas clases basadas en clases existentes, reutilizando su funcionalidad y extendiéndola según sea necesario. Esto fomenta la reutilización de código y facilita la creación de jerarquías de clases.

4. **Polimorfismo:** El polimorfismo permite que objetos de diferentes clases respondan de manera uniforme a los mismos mensajes. Esto significa que se puede tratar a objetos de diferentes clases de manera uniforme, lo que facilita el diseño de código genérico y flexible.

### Componentes

- **Clases:** Una clase es una plantilla para crear objetos. Define los atributos (datos) y métodos (funciones) que tendrán los objetos de esa clase.
- **Objetos:** Un objeto es una instancia concreta de una clase. Contiene datos y métodos que actúan sobre esos datos.
- **Atributos:** Los atributos son variables que almacenan el estado de un objeto.
- **Métodos:** Los métodos son funciones que operan en los datos de un objeto.
- **Mensajes:** Los mensajes son las solicitudes que un objeto envía a otro objeto para que realice alguna acción.

### Lenguajes de Programación

Muchos lenguajes de programación modernos admiten la programación orientada a objetos, incluyendo:

- Java
- C++
- C#
- Python
- Ruby
- JavaScript (a través de su modelo de objetos basado en prototipos)

Estos lenguajes ofrecen diferentes implementaciones y enfoques de la programación orientada a objetos, pero comparten los mismos principios fundamentales de abstracción, encapsulamiento, herencia y polimorfismo.

## Historia

La historia de la programación orientada a objetos (POO)
es fascinante y se remonta a varios hitos importantes
en el desarrollo de la informática y la programación de computadoras.

```{figure} ../images/historia.png
---
scale: 90%
align: center
name: fig11
---
Genealogía de lenguajes de programación
```

### Programación estructurada y modular

- En las décadas de 1950 y 1960, la programación estaba dominada por lenguajes de programación procedimentales, como Fortran y COBOL.
- A finales de la década de 1960 y principios de la década de 1970, surgieron enfoques estructurados y modulares para el desarrollo de software, promovidos por lenguajes como ALGOL y Pascal. Estos enfoques dividían los programas en módulos más pequeños y manejables.

### Primeros conceptos

- En la década de 1960, el lenguaje de programación Simula, desarrollado por Ole-Johan Dahl y Kristen Nygaard en Noruega, sentó las bases para la programación orientada a objetos.
- Simula introdujo conceptos como clases, objetos, herencia y polimorfismo, permitiendo a los programadores modelar entidades del mundo real en sus programas de una manera más natural.

### Revolución de Smalltalk

- En la década de 1970, en Xerox PARC, Alan Kay, Dan Ingalls y otros desarrollaron el lenguaje de programación Smalltalk, que se convirtió en uno de los primeros lenguajes completamente orientados a objetos.
- Smalltalk introdujo un entorno de programación interactivo basado en ventanas gráficas y objetos interactivos.
- Smalltalk popularizó conceptos como la herencia de clases, el polimorfismo y el encapsulamiento.

### Adopción generalizada de la POO

- A partir de la década de 1980, la programación orientada a objetos comenzó a ganar popularidad entre los desarrolladores de software.
- Lenguajes como C++ y Eiffel llevaron los conceptos de la POO a una audiencia más amplia y ofrecieron nuevas características y mejoras sobre los primeros lenguajes orientados a objetos.
- La introducción de bibliotecas y frameworks orientados a objetos permitió a los desarrolladores construir sistemas más grandes y complejos con mayor facilidad.

### Consolidación y la evolución continua

- En las décadas siguientes, la programación orientada a objetos se consolidó como uno de los principales paradigmas de desarrollo de software.
- Lenguajes como Java y C# se convirtieron en pilares de la programación orientada a objetos en la industria del software.
- La evolución de la tecnología, como la computación distribuida y la programación concurrente, ha llevado a la evolución de la POO con características adicionales para abordar estos nuevos desafíos.
