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?

Geplaatst in  | 2 reacties

Reacties

  1. RemVee zei ongeveer 8 uur later:

    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..

  2. Bret Pettichord zei 8 dagen later:

    In Watir 1.5, instead of

    ie.links.detect {|f| f.html =~ regex }

    You can do

    ie.link(:html, /regex/)

(Laat url/e-mail achter »)

   Voorvertoning