Bienvenidos una vez más a Ruby desde Cero. Hasta este capítulo hemos aprendido cómo instalar y configurar Ruby en nuestros computadores profundizando nuestros conocimientos acerca del lenguaje.
Para este nuevo capítulo, estaremos estudiando las clases en Ruby, detallando para cada una de ellas la sintaxis y demostración. Les recomiendo seguir la serie desde cero para comprender mejor este capítulo.
Clases.
En Ruby como en otros lenguajes que implementan el paradigma orientado a objetos, una clase se puede definir como una plantilla o una serie de instrucciones para crear un objeto. Las clases son creadas pensando en la reutilizaron de código y en las mismas se definen los atributos y el comportamiento que tendrán todos los objetos creados a partir de ella.
Una clase por lo general representa un sustantivo, como un objeto, persona, lugar o cosa dentro de la aplicación. Fundamentalmente, delimita los posibles estados y define el comportamiento del concepto que representa.
Tomemos el ejemplo de un vehículo: Consta de ruedas, la potencia y la capacidad del tanque de combustible; estas características forman los atributos del objeto vehículo. Se puede diferenciar un vehículo de la otra con la ayuda de estas características.
Un vehículo puede tener ciertas funciones o procedimientos a los que llamamos comportamiento, como la detención, la conducción y exceso de velocidad.
Un ejemplo de como se definiría la clase vehículo en Ruby es la siguiente:
Class Vehiculo
{
@numero_de_ruedas
@caballos_de_fuerza
@tipo_de_tanque
@capacidad
def exceso_velocidad
end
def manejar
end
def detenerse
end
end
Para comprender mejor las clases vamos a definir una a una sus características.
Instancia
Una instancia de un objeto en Ruby es la creación del mismo partiendo de una clase, cabe destacar que estos objetos son completamente independientes y pueden tener comportamientos y variables distintos entre ellos.
Un ejemplo de como se instancian los objetos en Ruby es el siguiente:
class Vehiculo
def detenerse
"frenando . . ."
end
end
automovil = Vehiculo.new
puts "El vehiculo esta " + automovil.detenerse
camion = Vehiculo.new
puts "El camion esta " + camion.detenerse
moto = Vehiculo.new
puts "La moto esta " + moto.detenerse
En el ejemplo se define una clase “vehiculo” bastante sencilla con un método único para detenerlo. Se crean tres objetos de tipo vehículo completamente diferentes pero con el mismo comportamiento. El resultado del ejemplo es el siguiente:
El vehiculo esta frenando . . . El camion esta frenando . . . La moto esta frenando . . .
Atributos
Los atributos en una clases son las características que definen el objeto, en el caso del vehículo los atributos pueden ser cantidad de ruedas, caballos de fuerza, cantidad de gasolina, etc. Las clases no tienen limites de atributos, así que no sean tímidos con los atributos.
Para mostrar estos ejemplos utilizaremos algunos de los tipos de variables que estudiamos en el Capítulo 2: Variables y Objetos.
class Vehiculo
def numero_ruedas
@numero_ruedas
end
def numero_ruedas=(numero)
@numero_ruedas = numero
end
end
automovil = Vehiculo.new
automovil.numero_ruedas = 4
puts "El vehiculo tiene " + automovil.numero_ruedas.to_s + " ruedas."
camion = Vehiculo.new
camion.numero_ruedas = 8
puts "El camion tiene " + camion.numero_ruedas.to_s + " ruedas."
moto = Vehiculo.new
moto.numero_ruedas = 2
puts "La moto tiene " + moto.numero_ruedas.to_s + " ruedas."
En este ejemplo podemos ver una variable de instancia “numero_ruedas”, pero a ésta no se le puede acceder de manera directa, si no, a través de métodos (getter y setters). El resultado de esta ejecución es la siguiente:
El vehiculo tiene 4 ruedas. El camion tiene 8 ruedas. La moto tiene 2 ruedas.
En el siguiente ejemplo veremos cómo se declaran y utilizan las variables públicas o de lectura y escritura únicamente:
class Vehiculo
attr_accessor :marca # variable publica
attr_reader :color # variable publica de solo lectura
attr_writer :velocidad_max # variable publica de solo escritura
def velocidad_max # sin este metodo no se puede leer
# el color fuera de la clase
@velocidad_max
end
def preparar_variables # este metodo escribe las variabbles de solo lectura
@color = "Amarillo"
end
def numero_ruedas
@numero_ruedas
end
def numero_ruedas=(numero)
@numero_ruedas = numero
end
end
automovil = Vehiculo.new
automovil.numero_ruedas = 4
automovil.velocidad_max = "180 km"
automovil.marca = "Nissan"
automovil.preparar_variables
puts "El vehiculo tiene " + automovil.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + automovil.velocidad_max + " marca: " + automovil.marca
puts "color: " + automovil.color
camion = Vehiculo.new
camion.numero_ruedas = 8
camion.velocidad_max = "120 km"
camion.marca = "Toyota"
camion.preparar_variables
puts "El camion tiene " + camion.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + camion.velocidad_max + " marca: " + camion.marca
puts "color: " + camion.color
En el ejemplo vemos cómo ‘marca’ es una variable pública, ‘color’ y ‘velocidad_max’ son sólo de lectura y escritura respectivamente. Al ejecutar el ejemplo tenemos como resultado lo siguiente:
El vehiculo tiene 4 ruedas. velocidad max: 180 km marca: Nissan color: Amarillo El camion tiene 8 ruedas. velocidad max: 120 km marca: Toyota color: Amarillo
Inicializar
Este método se ejecuta automáticamente cuando se instancia la clase del objeto sin necesidad de llamarlo. Para demostrarlo modificaremos un poco el método anterior de la siguiente manera:
class Vehiculo
attr_accessor :marca # variable publica
attr_reader :color # variable publica de solo lectura
attr_writer :velocidad_max # variable publica de solo escritura
def initialize # este método se llama automáticamente al instanciar el objeto
@color = "Amarillo"
end
def velocidad_max # sin este método no se puede leer
# el color fuera de la clase
@velocidad_max
end
def numero_ruedas
@numero_ruedas
end
def numero_ruedas=(numero)
@numero_ruedas = numero
end
end
automovil = Vehiculo.new
automovil.numero_ruedas = 4
automovil.velocidad_max = "180 km"
automovil.marca = "Nissan"
puts "El vehiculo tiene " + automovil.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + automovil.velocidad_max + " marca: " + automovil.marca
puts "color: " + automovil.color
camion = Vehiculo.new
camion.numero_ruedas = 8
camion.velocidad_max = "120 km"
camion.marca = "Toyota"
puts "El camion tiene " + camion.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + camion.velocidad_max + " marca: " + camion.marca
puts "color: " + camion.color
Como ven en este objeto se eliminó el método ‘preparar_variables’ y se agregó el método ‘initialize’ que se llama automáticamente luego de instanciar el objeto. El resultado de este ejemplo es exactamente igual al primero.
Métodos
Los métodos en una clases son las que definen el comportamiento del objeto, en el caso del vehículo los métodos pueden ser cantidad de vehículos instanciados, modificar o consultar algún atributo, etc. En los ejemplos anteriores ya hicimos uso de métodos de clases para consultar y modificar los atributos de la clase.
En el ejemplo aprenderemos a crear métodos estáticos, que se pueden llamar sin instanciar la clase, y a usar por primera vez en el curso las variables de clase:
class Vehiculo
attr_accessor :marca # variable publica
attr_reader :color # variable publica de solo lectura
attr_writer :velocidad_max # variable publica de solo escritura
@@cantidad_de_vehiculos_instanciados = 0
def initialize # este metodo se llama automaticamente al instanciar el objeto
@color = "Amarillo"
@@cantidad_de_vehiculos_instanciados +=1
end
def velocidad_max # sin este metodo no se puede leer
# el color fuera de la clase
@velocidad_max
end
def numero_ruedas
@numero_ruedas
end
def numero_ruedas=(numero)
@numero_ruedas = numero
end
def self.numero_vehiculos_instanciados
@@cantidad_de_vehiculos_instanciados
end
end
automovil = Vehiculo.new
automovil.numero_ruedas = 4
automovil.velocidad_max = "180 km"
automovil.marca = "Nissan"
puts "El vehiculo tiene " + automovil.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + automovil.velocidad_max + " marca: " + automovil.marca
puts "color: " + automovil.color
camion = Vehiculo.new
camion.numero_ruedas = 8
camion.velocidad_max = "120 km"
camion.marca = "Toyota"
puts "El camion tiene " + camion.numero_ruedas.to_s + " ruedas."
puts "velocidad max: " + camion.velocidad_max + " marca: " + camion.marca
puts "color: " + camion.color
puts "cantidad de vehiculos intanciados: " + Vehiculo.numero_vehiculos_instanciados.to_s
En el ejemplo vemos como se declaran las variables estáticas (‘self.numero_vehiculos_instanciados’) es importante destacar que no hace falta inicializar el objeto para llamar al método y el uso de las variables de clase, para este caso la utilizamos para que sume la cantidad de vehículos creados a partir de la clase ‘Vehiculo’. El resultado del ejemplo es el siguiente:
El vehiculo tiene 4 ruedas. velocidad max: 180 km marca: Nissan color: Amarillo El camion tiene 8 ruedas. velocidad max: 120 km marca: Toyota color: Amarillo cantidad de vehiculos intanciados: 2
Conclusión
En este capítulo hemos adquirido herramientas importantes sobre las clases en Ruby, cómo realizar instancias de clases y a manipular los objetos generados a través de las clases.
Aún nos falta un poco para completar este tema de las clases, para el próximo capítulo estaremos estudiando las herencias entre clases.
Si te surgen dudas con nuestros cursos, no te detengas y danos tus comentarios, que con gusto estamos dispuestos a resolver tus inquietudes.
¡Hasta el próximo capítulo!