domingo, 27 de julio de 2008

Atributos virtuales en Ruby

Los métodos set y get de las clases se usan supuestamente para encapsular la información y ocultar la implementación de esa clase.

Lo que ocurre es que muchas veces no se aprovecha adecuadamente esta última posibilidad, donde hay getAtributo debería haber getInformacion, que no siempre es exactamente lo mismo. No se oculta la implementación de la clase (que haría más fácil futuros cambios) sino que prácticamente se nos están diciendo los atributos.

En ruby se pueden usar atributos virtuales para realmente separar entre la información útil de la clase y los atributos que se necesitan para almacenarla.

#!/usr/bin/ruby

class Tiempo
attr_accessor :segundos;

def minutos=(new_minutos)
@segundos = new_minutos*60;
end

def minutos
@segundos/60
end

def horas=(new_horas)
@segundos = new_horas*60*60;
end

def horas
@segundos/(60*60)
end
end

t = Tiempo.new
t.segundos = 3;
puts t.segundos

t.minutos = 3;
puts "#{t.minutos} #{t.segundos}"

t.horas = 1;
puts t.minutos

Nos es totalmente indiferente como se guarde la información (en este caso en segundos), se convierte dinámicamente entre unidades sin ningún problema, tanto para obtener información como para grabarla.

Se hace pues la distinción entre información(horas, minutos, segundos) y los atributos(segundos). Aquí hay un ejemplo de lo que no hay que hacer, por dos motivos:

1) Dejar la interfaz de la clase de forma no intuitiva, hay que convertir a milisegundos para guardar una fecha.

2) Dejar todos los métodos útiles para obtener información sin mantener (deprecated) al haber cambiado la implementación de la clase.

0 comentarios: