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
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’.
Wat is er dan mis met?