Me gusta la nueva versión de cofradia. ;). Hace un año quería hacer un curso de Ruby en línea; no lo llevé acabo sin embargo, pienso ir publicando código que
considero le puede interesar a alguien.
Este ejemplo en java
me pareció muy ilustrativo y decidí implementarlo en Ruby, es el metapatrón MVC
codificado con el patrón observer. El ejemplo consta de una clase para cada componente
TemperatureModel, TemperatureView(GUI) y el TemperatureController, la gui
está desarrollada con ruby-gtk y glade.
El controlador: TemperatureController.rb
require "observer" require 'TemperatureModel.rb' require 'TemperatureView.rb' class TemperatureWatcher def initialize(t,g) t.add_listener(self) @gui = g end def celsius_changer(temp) @newc = temp @newf = @newc*9.0/5.0 + 32.0 @gui.setDisplayF(@newf) @gui.setDisplayC(@newc) @gui.setTemp(@newc) end def faranheit_changer(temp) @newf = temp @newc = (@newf -32.0)*5.0/9.0 @gui.setDisplayF(@newf) @gui.setDisplayC(@newc) @gui.setTemp(@newc) end end INICIALTEMP = 32.0 temperature = TemperatureModel.new tgui = TemperatureGUI.new(INICIALTEMP,temperature) watcher = TemperatureWatcher.new(temperature,tgui) Gtk.init Gtk.main |
El modelo: TemperatureModel.rb
class TemperatureModel def initialize @listeners = [] end def add_listener(listener) @listeners << listener end def upF(temp) @temp = temp @temp += 1 @listeners.each {|l| l.faranheit_changer(@temp) } end def downF(temp) @temp = temp @temp -= 1 @listeners.each {|l| l.faranheit_changer(@temp) } end def upC(temp) @temp = temp @temp += 1 @listeners.each {|l| l.celsius_changer(@temp) } end def downC(temp) @temp = temp @temp -= 1 @listeners.each {|l| l.celsius_changer(@temp) } end def newtC(temp) @temp = temp @listeners.each {|l| l.celsius_changer(@temp) } end end |
El gui: TemperatureView.rb
require 'libglade2' class TemperatureGUI def initialize(temp,temperature) @temp, @temperature = temp,temperature @glade = GladeXML.new("temp.glade") {|handler| method(handler)} @entryF = @glade["entry1"] @entryC = @glade["entry2"] @vscale = @glade["vscale1"] @entryF.set_text(@temp.to_s) @entryC.set_text(((5.0/9.0)*(@temp-32.0)).to_s) @vscale.set_value((5.0/9.0)*(@temp-32.0)) f_up_button = @glade["button1"] f_down_button = @glade["button2"] c_up_button = @glade["button3"] c_down_button = @glade["button4"] end def setDisplayF(newF) @newF = newF @entryF.set_text("#{@newF}") end def setDisplayC(newC) @newC = newC @entryC.set_text("#{@newC}") end def getDisplayF @entryF.text.to_f end def getDisplayC @entryC.text.to_f end def procScale @v = @vscale.value @temperature.newtC(@v) end def procEntryC @v = getDisplayC @temperature.newtC(@v) end def procEntryF @nv = getDisplayF @v = (5.0/9.0)*(@nv-32.0) @temperature.newtC(@v) end def upF @temp = getDisplayF @temperature.upF(@temp) end def downF @temp = getDisplayF @temperature.downF(@temp) end def upC @temp = getDisplayC @temperature.upC(@temp) end def downC @temp = getDisplayC @temperature.downC(@temp) end def setTemp(t) @t = t @vscale.set_value(@t) end def quit Gtk.main_quit end end |
Todos los archivos los pueden bajar de aqui, incluyendo el archivo glade.
Muy buen ejemplo,parece que últimamente ha estado ganando muchos adeptos Ruby, por aquí, bien!!!.
Sobre el curso de Ruby en línea suena muy bien la idea.
@emeza: ¡Chido! Te recomiendo también que pongas tu código en GitHub, por dos razones. Una, porque está chido 🙂 y dos, porque hay mucha gente Rubyist que está participando. Y sé que eres uno de los pocos que como yo usábamos Ruby desde mucho antes que fuera el hype.
Saludos!