Vamos repasando las bases: POO

Ybom LittleCar
May 2, 2018 · 5 min read

A veces es necesario dar unos pasos atrás antes de querer aprender un nuevo framework o lenguaje de programación. Si uno no tiene las bases, nos será mas difícil entender los nuevos temas. Es normal que quieras aprender las cosas rápido, lamentablemente así no funciona la vida. Si quieres aprender algo, apréndelo con todo, si programación orientada a objetos es parte de ello, aquí te dejo unos conceptos básico que te servirán.

¿Qué es la Programación Orientada a Objetos?

Es un paradigma de programación, es decir una manera de resolver problemas usando la programación. En este paradigma, todo va a girar entorno a un objeto que tendrá propiedades y comportamientos. Entonces, ¿qué es un objeto? Un objeto es una abstracción de la realidad, que lo vamos a representar en una clase. Deja explico mas este concepto.

Abstracción de la realidad

Cuando decimos abstraer la realidad suena a algo confuso y poético a la vez. Si bien programar requiere de mucha creatividad, el nombre de este concepto está mas loco de lo que en realidad es. Pongamos de ejemplo que queremos representar un punto usando POO. ¿Qué es lo que tiene un punto? Bueno matemáticamente (¿geométricamente?) lo puedes representar en un plano si tienes sus coordenadas x y y. Entonces va, ya tenemos sus propiedades, una x y una y. Ahora queremos una línea, bueno una línea consta de dos puntos.

Con esto podemos tener figuras geométricas, las cuales tendrán 3 o mas líneas. No solo tendrán esas propiedades, si no que también tendrán comportamientos como obtener la base, la altura, el área, girar la figura, crecer o encoger, etc.

A esto es a lo que llamamos abstraer la realidad, de un objeto real, decidir cuales serán sus propiedades y comportamientos en nuestra clase. En el clásico ejemplo del inventario de una tienda, ¿qué es lo que tiene un producto?, bueno pues tiene nombre, categoría, marca, y precio.

http://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/images/philosophy.png

Clase vs Objeto

Una vez entendido el concepto de Objeto, es necesario diferenciar entre lo que es una clase y un objeto.

Una clase es machote o patrón con el que vas a construir objetos, es el archivo donde estás viendo la definición de la clase con sus variables (propiedades) y sus métodos (comportamientos).

Un objeto, o instancia de la clase, vive en el stack de memoria, es una estructura de datos que fue construida usando el constructor de la clase y tiene un estado, es decir sus propiedades tienen valores. En el ejemplo del punto, podemos saber el valor de x y de y.

Herencia

La herencia en POO nos permite hacer varias cosas: no repetir código, organizar nuestros objetos, y usar polimorfismo, siendo éste último (IMHO) el punto mas importante para decidir si vale la pena usar herencia.

Pero en sí ¿qué es la herencia? Bueno se refiere a tener una super clase con atributos y métodos muy genéricos. Y después varias sub clases mas especificas. Por ejemplo, en el libro de certificación de Java tienen un ejemplo muy bueno para recordarlo. La clase padre (super clase) es un carro, tiene lo básico que todo carro va a tener: marca, color y modelo. La clase hija (sub clase) es un Mustang la cual, aparte de tener atributos mas específicos, no va acelerar y frenar igual que cualquier otro carro. Sin embargo, Mustang ya no tiene que definir marca, color, y modelo, ni el método encender, porque ya lo tiene, ya que lo heredó:

Supongamos que la función avanzar hace algo super complicado.

Interfaces

Las interfaces son como superclases pero que no tienen ni constructor y sus métodos no tienen cuerpo, no están implementados. No tienen atributos porque las interfaces no las vas a instanciar, pero puedes definir constantes, valores que no van a cambiar. En algunos lados describen a las interfaces como contratos que una clase debe implementar. A lo que se compromete hacer :)

Mas que nada definen un comportamiento que una clase va a tener. Puede ser algo tan general como “iluminable” y lo van a implementar objetos como “foco”, “linterna”, “monitor”, o cualquier cosa que pueda emitir luz. No dicen como va a iluminar, si no que tendrá ciertas funciones relacionadas a ello: “emitirLuz”, “definirIntensidad”, “obtenerWatts”, etc.

En el ejemplo de Car, si sabemos que todas nuestras subclases terminarán definiendo sus atributos y redefiniendo los métodos encender, acelerar, y frenar, tal vez nos convenga que Car sea una interfaz y no una superclase.

Polimorfismo

Este es un concepto un poco complicado de explicar, pero es importante repasarlo, así que haré lo mejor posible para explicarlo. Usemos el ejemplo del carro y el Mustang. ¿Para qué nos sirve saber que un Mustang es un Carro también? No es solo para aprovechar los métodos que ya tiene Carro, probablemente es porque en otra parte del código, vamos a estar construyendo carros, no importa de que subclase sean (Mustang, Tsuru, Lambo), tú sabes que van a tener un método encender, acelerar y frenar.

No tengo ni Lambo, ni Mustang, ni Tsuru; pero tengo salud.

Observemos el método tryCars, estoy llamando los métodos de Car, no importando cuál sea su implementación, es decir qué instancia es la que realmente vive en memoria. Sé que tendrán esos métodos, porque extienden de Car. O implementan Car, si Car fuera una interfaz.

Mas conceptos de POO

Estos son los conceptos que yo considero mas importantes de POO, que son útiles actualmente, pero por favor déjame tus comentarios de qué otros conceptos son también importantes conocer, que sean útiles para resolver problemas prácticos.

TechWo

Comunidad formada por mujeres y hombres generadores de tecnología en busca del conocimiento y la inclusión de la mujer en TI.

Thanks to Marcela Bonell.

Ybom LittleCar

Written by

Software Engineer, backend developer, business anaylist, drupalist, and now devops junior

TechWo

TechWo

Comunidad formada por mujeres y hombres generadores de tecnología en busca del conocimiento y la inclusión de la mujer en TI.