DRY blijven door meta programmeren
Geplaatst door Remco van 't Veer di, 10 jan 2006 17:51:00 GMT
In een poging DRY te blijven, ben ik in de wondere wereld van ruby meta programmeren terecht gekomen. Het was er mooi en dat wil ik graag delen.
Ik was bezig met het maken van een subclass van String, Html. Mijn variant kan wat specifieke manipulaties uitvoeren: absolutize(url) om alle links absolute te maken, escape om speciale tekens te vervangen en sanitize(tags = nil) om tags, welke niet toegestaan zijn, te verwijderen. Na de methoden geschreven te hebben en een TestCase aangemaakt, bedacht ik me dat ik ook een !- (past het daadwerkelijk object aan) en self.-variant (class methode waar een String object ingaat en gemodificeerde versie uitkomt) wil hebben.
Ik heb eerst alles omgeschreven naar een !-variant, m’n code werd hier eigenlijk veel duidelijker van; geen value.gsub!(.. meer maar gsub!(... En ik ben m’n varianten gaan toevoegen:
def escape
result = dup
result.escape!
result
end
def self.escape(value)
result = Html.new(value)
result.escape!
result.to_s
end
Ho wacht! Moet ik die nu voor alle drie de methoden doen?! Maar dat is niet DRY! Ik wil kunnen schrijven:
def_variants :escape
