method_missing update
Geplaatst door Michiel de Mare ma, 12 jun 2006 23:43:00 GMT
Voor alle duidelijkheid, mijn artikel van gisteren was geen voorstel voor het vervangen van method_missing in Object, en strings zijn niet een bijzonder geschikte kandidaat voor deze techniek.
Maar ik denk dat deze techniek nuttig kan zijn binnen DSLs. Een voorbeeld waar ik aan dacht is Watir. Watir is een library om Internet Explorer te scripten. Een Watir script is meestal een lange lijst instructies die nog al op elkaar lijken:ie.link(:text,'Aanmelden').click
ie.checkbox(:index,1).set
ie.text_field(:index,1).set 'secretaresse'
ie.link(:text, /secretaresse/i).click
ie.links.detect {|f| f.html =~ /verder.gif/ }.click
Om de code korter en leesbaarder te houden kun je een hoop (extreem korte) methodes definieren, zoals deze:
def detect_link(regex)
links.detect {|f| f.html =~ regex }
end
def detect_verder_link
detect_link /verder.gif/
end
def click_verder_link
detect_verder_link.click
end
ie.detect_link(/ICT/).click
ie.click_verder_link
Maar waarom zou je deze methodes niet inline kunnen definieren zodra je ze voor het eerst nodig hebt?
ie.click_verder_link { self.detect_verder_link.click }
ie.click_verder_link
Is dat niet handiger? Is dat niet eleganter? En is dat niet eenvoudiger voor de gebruikers van een DSL die misschien geen ervaren Ruby-programmeurs zijn?
In lange instructie lijsten kan ik me er iets bij voorstellen. De leesbaarheid blijft echter ver te zoeken. De laatste twee statements “doen” hetzelfde maar zien er anders uit? Of geef ik het eerste statement een blok mee en het tweede niet? Brrrr..
In Watir 1.5, instead of
You can do