Al igual que los pantalones de paracaídas y el Pac-Man, la POO (programación orientada a objetos) tuvo sus inicios en la década de 1980. Pero a diferencia de las modas y los personajes de los videojuegos, este modelo de programación sigue vigente después de tantos años.
La POO se ha convertido en una parte fundamental del desarrollo de software. Gracias a la ubicuidad de lenguajes como Java y C++, no se puede desarrollar software para móviles si no se entiende el enfoque orientado a objetos. Lo mismo ocurre con el desarrollo web serio, dada la popularidad de los lenguajes de POO como Python, PHP y Ruby.
Conseguir la idea de la programación orientada a objetos puede ser un reto para algunos profesionales de la informática. Es posible que se pregunte por qué necesita objetos cuando podría utilizar el enfoque descendente de la programación estructurada tradicional en lenguajes como Visual Basic.
Si ha escrito este tipo de software, probablemente esté acostumbrado a dividir grandes problemas en subproblemas y resolverlos en unidades de código separadas. O puede que tenga experiencia con la programación funcional, que trata los elementos del código como funciones matemáticas precisas, y evita que afecten a otros elementos, es decir, sin efectos secundarios.
Sin embargo, si se familiariza con la programación orientada a objetos (OOP), verá que se trata de una forma totalmente nueva de resolver problemas. El concepto básico es que en lugar de escribir un programa, se crea una clase, que es una especie de plantilla que contiene variables y funciones. Los objetos son instancias autocontenidas de esa clase, y puedes hacer que interactúen de formas divertidas y emocionantes.
Las ventajas de la programación orientada a objetos residen en este tipo de encapsulación. A continuación se detallan algunas de las principales ventajas de la POO:
Modularidad para facilitar la resolución de problemas
Algo ha ido mal, y no tienes ni idea de dónde buscar. ¿El problema está en el archivo del widget o en el WhaleFlumper? ¿Tendrás que revisar ese archivo «sewage.c»? Espero que hayas comentado tu código!
Cuando trabajas con lenguajes de programación orientados a objetos, sabes exactamente dónde buscar. «Oh, ¿el objeto coche se ha estropeado? El problema debe estar en la clase Coche». No tienes que buscar en nada más.
Esa es la belleza de la encapsulación. Los objetos son autocontenidos, y cada parte de la funcionalidad hace su propia cosa mientras deja las otras partes en paz. Además, esta modalidad permite que un equipo de TI trabaje en múltiples objetos simultáneamente mientras se minimiza la posibilidad de que una persona duplique la funcionalidad de otra.
Podemos ayudarle a encontrar su próximo trabajo de programación:
Reutilización del código a través de la herencia
Suponga que además de su objeto Coche, un colega necesita un objeto Coche de carreras, y otro necesita un objeto Limusina. Cada uno construye sus objetos por separado pero descubre puntos comunes entre ellos. De hecho, cada objeto es en realidad un tipo diferente de Coche. Aquí es donde la técnica de la herencia ahorra tiempo: Cree una clase genérica (Car), y luego defina las subclases (RaceCar y Limousine) que van a heredar los rasgos de la clase genérica.
Por supuesto, Limousine y RaceCar todavía tienen sus atributos y funciones únicas. Si el objeto RaceCar necesita un método para «fireAfterBurners» y el objeto Limousine requiere un Chauffeur, cada clase podría implementar funciones separadas sólo para sí misma. Sin embargo, debido a que ambas clases heredan aspectos clave de la clase Car, por ejemplo los métodos «drive» o «fillUpGas», sus clases herederas pueden simplemente reutilizar el código existente en lugar de escribir estas funciones de nuevo.
¿Qué pasa si quieres hacer un cambio en todos los objetos Car, independientemente del tipo? Esta es otra ventaja del enfoque OO. Simplemente haz un cambio en tu clase Car, y todos los objetos Car simplemente heredarán el nuevo código.
Flexibilidad a través del polimorfismo
Siguiendo con este ejemplo, ahora sólo necesitas unos pocos drivers, o funciones, como «driveCar,» driveRaceCar» y «DriveLimousine.» RaceCarDrivers comparten algunos rasgos con LimousineDrivers, pero otras cosas, como RaceHelmets y BeverageSponsorships, son únicas.
Aquí es donde entra en juego el dulce polimorfismo de la programación orientada a objetos. Debido a que una sola función puede cambiar de forma para adaptarse a cualquier clase en la que se encuentre, podrías crear una función en la clase padre Car llamada «drive» – no «driveCar» o «driveRaceCar», sino simplemente «drive». Esta función funcionaría con RaceCarDriver, LimousineDriver, etc. De hecho, incluso podría tener «raceCar.drive(myRaceCarDriver)» o «limo.drive(myChauffeur)».
Resolución efectiva de problemas
Un lenguaje como C tiene un legado increíble en la historia de la programación, pero escribir software en un lenguaje de arriba hacia abajo es como jugar al Jenga con guantes. Cuanto más complejo sea, mayor será la posibilidad de que se derrumbe. Mientras tanto, escribir un programa de estilo funcional en un lenguaje como Haskell o ML puede ser una faena.
La programación orientada a objetos suele ser el enfoque más natural y pragmático, una vez que se le coge el tranquillo. Los lenguajes de programación orientada a objetos (POO) le permiten dividir su software en problemas del tamaño de un bocado que luego puede resolver – un objeto a la vez.
Esto no quiere decir que la POO es la única manera verdadera. Sin embargo, las ventajas de la programación orientada a objetos son muchas. Cuando necesite resolver retos de programación complejos y quiera añadir herramientas de código a su conjunto de habilidades, la POO es su amiga – y tiene mucha más longevidad y utilidad que Pac-Man o los pantalones de paracaídas.