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