De Lopende Band

Geplaatst door Michiel de Mare zo, 05 nov 2006 06:16:00 GMT

Stel, je hebt het volgende probleem: je hebt een ‘roman’ object, en je wil de coördinaten van het adres van de schrijver weten, zodat je die kan tonen in je nieuwe google maps mashup. Dat lijkt simpel:
roman.schrijver.adres.postcode.to_coordinates
Deze constructie, waarbij een aantal methodes aan elkaar worden geschakeld en de output van de ene de input van de volgende is, is een Design Pattern. Ik noem hem ‘De Lopende Band’.

Maar helaas, sommige romans zijn onder pseudoniem geschreven, sommige schrijvers zijn dood of hebben een geheim adres, van sommige adressen is geen postcode bekend, en niet alle postcodes kunnen naar coördinaten vertaald worden. Elke method call kan een nil opleveren. Dus ziet je code er plotseling zo uit:

coordinates = nil
schrijver = roman.schrijver
if schrijver
  adres = schrijver.adres
  if adres
    postcode = adres.postcode
    if postcode
      coordinates = postcode.to_coordinates
    end
  end
end
Het probleem is dat de methodes niet meer naadloos op elkaar aansluiten. Tussen elke methode-aanroep moet een stukje code geplaatst worden dat kijkt of de output van de laatste aanroep nil is, en als dat zo is, moet het de lopende band stopzetten en nil teruggeven.

Maar moet dat echt met de hand? Kan dat niet makkelijker? Je kunt namelijk methode-aanroepen opnemen, en later afspelen (het VCR pattern). Tijdens het afspelen kun je dan de benodigde code toevoegen. Je code ziet er dan bijvoorbeeld zo uit:

maybe(roman).schrijver.adres.postcode.to_coordinates.STOP

Dit pattern kun je gebruiken op elke plek waar je eigenlijk een aantal methode-aanroepen aan elkaar wilt knopen, maar waar je input en output niet goed op elkaar aansluiten. Voorbeelden:
list(text).split(',').split('.').split(';').STOP
Of in plaats van
obj.foo(mystate).bar(mystate).baz(mystate)
state(obj,mystate).foo.bar.baz.STOP

Het toevoegen van extra instructies bij elke stap van een Lopende Band heet ook wel ‘Monad’.

1 reactie

Reacties

  1. Matthijs Langenberg zei ongeveer 20 uur later:
    Wat is er dan mis met?
    begin
      roman.schrijver.adres.postcode.to_coordinates
    rescue NoMethodError
      "Coordinaten niet gevonden"
    end
    Het VCR pattern is wel interessant trouwens.

(Laat url/e-mail achter »)

   Voorvertoning