Aprende POO con Ruby
Un paradigma que cambiará tu forma de ver las cosas
La programación orientada a objetos (poo) se define según Wikipedia como:
Un paradigma de la programación orientado a abstracciones de algún hecho o ente del mundo real (objeto), con atributos que representan sus características o propiedades, y métodos que emulan su comportamiento o actividad. Todas las propiedades y métodos comunes a los objetos se encapsulan o agrupan en clases. Una clase es una plantilla, un prototipo para crear objetos; en general, se dice que cada objeto es una instancia o ejemplar de una clase.
Si después de leer esa definición quedaste viendo para los lados y con 3 puntos menos de autoestima, tranquilo, todo va a estar bien.
Es mucho más fácil de lo que parece, primero debemos entender algunos conceptos básicos y con un poco de practica le daremos paso a la programación orientada a objetos a nuestras vidas.
Clases
Las clases son como el plano (blueprint) principal de un objeto, a partir de una clase se crean objetos. Este plano define que aspecto o características va a tener o como se va a comportar.
En el mundo real a menudo encontramos muchos objetos del mismo tipo. Todas las marcas y modelos de automóviles tienen motor, ruedas, puertas, etc. Cada automóvil fue construido a partir del mismo conjunto de planos y tiene los mismos componentes.
Además los automóviles tienen datos como el número de ruedas, el número de puertas, la capacidad de asientos y también tienen comportamientos como acelerar, detener, quedarse accidentados en momentos inoportunos, etc.
Basados en la programación orientada a objetos podemos llamar a los datos como atributos y al comportamiento como métodos
Datos → Atributos y Comportamiento → Métodos
Veamos un ejemplo de como podemos declarar una clase con Ruby
La sintaxis es bastante simple, la palabra reservada class
debe de anteceder el nombre de nuestra clase y como convención en Ruby siempre escribiremos el nombre de nuestra clase con la primera letra en “Mayúscula”.
Instancia
El siguiente concepto que tenemos que traer a la mesa es: la instancia de la clase. Esto no es más que una representación de nuestra clase Vehicle
.
Imaginemos que tenemos un molde para hacer gelatina, si ponemos nuestra mezcla de gelatina en el model, con el tiempo tendremos una replica del molde hecho con gelatina. Si repetimos una y otra vez ese proceso tendremos un ejercito de gelatina listo para ser comido.
Así que en este punto podemos llamar a nuestro molde una clase y a nuestra gelatina sacada de ese molde la instancia de una clase.
Ahora que tenemos ese punto claro ¿como creamos instancias/objetos de la clase Vehicle
?
Así de simple, la palabra reservada new
permite crear instancias/objetos, es importante almacenar este objeto creado en una variable, para su posterior uso.
Hasta ahora tenemos un vehículo que no hace absolutamente nada, de hecho tenemos un concepto etéreo de vehículo ya que no le hemos dado forma, para ello debemos hacer uso de un constructor.
Constructor
Un constructor, es un Bob 👷 … asdasd
Un constructor es un método que se ejecuta automáticamente, cuando ejecutamos .new
sobre una clase. Dentro de la estructura del constructor podemos definir todos los atributos de nuestra clase.
La palabra reservada initialize
define nuestro constructor, todos los argumentos que recibimos al momento de crear una instancia de nuestro objeto, los asignaremos a variables de instancia, de eso hablaremos en un momento.
Atributos
Los datos que caracterizan a un Vehículo son sus atributos es por ello que usamos las variables de instancia para poder acceder a estos datos. ¿Como lo hacemos?
Como podemos observar acabamos de definir métodos de instancia y accedimos a información guardada en las variables de instancia definidas en el constructor inicialize
.
Estos métodos de lectura de datos se suelen llamar getters y son necesarios para acceder a los datos la instancia.
Si queremos cambiar un atributo de nuestra instancia tenemos que definir los llamados métodos setters y podemos hacerlo de la siguiente manera:
¿Se imaginan tener que definir siempre todos los métodos getters y setters de todos los atributos de nuestra clase? ¿Y si nuestra clase tiene más de 20 atributos?
Es por eso que en Ruby tenemos macros que permiten que se definan los getters y los setters automágicamente:
Los tipos de atributos de acceso son:
attr_reader
(read-only/getter)attr_writer
(write-only/setter)attr_accessor
(read & write/getter & setter)
Métodos
Por último nos falta definir métodos que nos permitan darle comportamiento a nuestro objeto, así que definamos el método engine_start
en nuestra clase Vehicle
¡Eso es todo por ahora!
Hemos aprendido algunos conceptos de programación orientada a objetos en Ruby:
- Objetos & Clases
- Atributos como data de los objetos
- Métodos como comportamiento de los objetos
- Usamos los getters y setters de Ruby