Programación Orientada a Objetos 1 - Introducción

En este capítulo veremos una introducción a lo que es la Programación Orientada a Objetos (POO) y cómo se diferencia de otros paradigmas de programación.

Nuestro viaje comenzará con una retrospectiva histórica, luego avanzaremos a través de sus conceptos fundamentales como clases y objetos (más adelante los veremos en detalle), y concluiremos con las ventajas que ofrece la POO.

Historia de la POO

La POO no surgió de la noche a la mañana, fue el resultado de un esfuerzo continuo, por parte de muchos programadores, por hacer que el software sea más manejable, confiable y adaptable.

El primer paradigma que se adoptó fue la programación estructurada, descubierto por Dijkstra, quien demostró que el uso de saltos sin limitaciones (intrucciones goto) es malo para la estructura del programa. Posteriormente sustituyó esos saltos por instrucciones if/else y while/do while/until.

A finales de los años 60 y principios de los 70, lenguajes como Simula y Smalltalk introdujeron los conceptos que hoy consideramos pilares de la POO.

Esto fue un cambio de paradigma, pasando de ver el software como una secuencia de procedimientos (programación estructurada) a verlo como un conjunto de entidades que interactúan entre sí, una forma de modelar el mundo real. 

Muchos usan 3 palabras para definir la POO, encapsulamiento, herencia y polimorfismo, términos que veremos más adelante.

Conceptos de Clase y Objeto

Para entender la POO, debemos empezar por sus componentes básicos: las clases y los objetos.

Clase

Una clase es un modelo, como un plano o una plantilla. Es una definición abstracta, describe las características y los comportamientos de algo.

Por ejemplo, si consideramos una clase “Auto”, esta podría tener características (atributos) como color, marca y modelo, y comportamientos (métodos) como arrancar o frenar.

Objeto

Un objeto es una instancia concreta de una clase.

Siguiendo con nuestro ejemplo, un objeto sería un auto específico, como un Toyota Corolla azul de 2020.

Tiene los atributos y comportamientos definidos por la clase, pero con valores y estados concretos.

Ventajas de la POO

La POO ofrece varias ventajas significativas sobre otros paradigmas de programación:

  • Modularidad: El código se organiza en clases, facilitando su comprensión, desarrollo y mantenimiento.
  • Reutilización: Las clases pueden ser reutilizadas en diferentes partes de una aplicación o en proyectos futuros.
  • Extensibilidad: Es fácil añadir nuevas características o modificar las existentes sin alterar el sistema.
  • Abstracción: Permite concentrarse en lo que hace un objeto, más que en cómo lo hace, ocultando los detalles complicados y mostrando solo lo esencial.
  • Polimorfismo: Los objetos de diferentes clases pueden ser tratados como objetos de una clase común.

Ejemplo Práctico

En este ejemplo vamos a hacer una comparación entre el enfoque Estructurado y la POO.

Debemos construir un sistema para gestionar vehículos en un taller mecánico.

En un enfoque estructurado, podríamos tener funciones separadas para cada operación, como “repararAuto“, “pintarAuto“, y así sucesivamente.

Cada función necesita saber sobre el auto, lo que puede llevar a código repetitivo y difícil de mantener.


    // Atributos del auto
    String marca = "Toyota";
    String modelo = "Corolla";
    String color = "Azul";

    // Funciones para operar sobre el auto
    void repararAuto(String marca, String modelo) {
        System.out.println("Reparando " + marca + " " + modelo);
    }

    void pintarAuto(String marca, String modelo, String color) {
        System.out.println("Pintando " + marca + " " + modelo + " de color " + color);
    }

    // Llamada a las funciones
    auto.repararAuto(auto.marca, auto.modelo);
    auto.pintarAuto(auto.marca, auto.modelo, auto.color);
            

Con el paradigma POO, definiendo una clase “Auto”, con métodos como “reparar” y “pintar”, cada auto es un objeto, con sus propiedades (su estado) y sus operaciones.

El código para manejar un autos queda organizado y encapsulado dentro de la clase.


    class Auto {
        String marca;
        String modelo;
        String color;
    
        // Constructor
        public Auto(String marca, String modelo, String color) {
            this.marca = marca;
            this.modelo = modelo;
            this.color = color;
        }
    
        // Método para reparar el auto
        void reparar() {
            System.out.println("Reparando " + marca + " " + modelo);
        }
    
        // Método para pintar el auto
        void pintar(String nuevoColor) {
            this.color = nuevoColor;
            System.out.println("Pintando " + marca + " " + modelo + " de color " + nuevoColor);
        }
      }    

    // Uso de la clase Auto
    Auto miAuto = new Auto("Toyota", "Corolla", "Azul");
    miAuto.reparar();
    miAuto.pintar("Rojo");
            

Conclusiones

La POO es una poderosa herramienta para todo desarrollador de software. Ofrece una forma más intuitiva y flexible de pensar en cómo el código y los datos se organizan y se relacionan entre sí.

A lo largo de esta serie de capítulos exploraremos más a fondo cada uno de estos conceptos y cómo aplicarlos en Java, para que puedas escribir software efectivo y elegante.