Leesbare boolean parameters
Geplaatst door Michiel de Mare do, 30 okt 2008 14:34:00 GMT
Soms heb je methodes met een flink aantal parameters, waarvan een aantal booleans zijn. Je aanroep ziet er dan bijvoorbeeld als volgt uit:
button(name, url, false, true, false)
Wat de boolean options betekenen is een volslagen raadsel, zonder er de source bij te pakken, zelfs als je al bekend bent met de methode. Dat is waarom ruby programmeur vaak option hashes gebruiken.
Maar wat dacht je van de volgende notatie:
button(name, url, !:use_form, :icon_only, !:default)
:icon_only
evalueert tot true
en !:use_form
tot false
.
Zo wordt het meteen duidelijk wat de booleans betekenen. Wel moet je de volgorde van de parameters goed hebben (in tegenstelling tot een option hash), maar wie de bovenstaande code leest kan de methode-aanroep veel makkelijker begrijpen.
Je hebt alleen de waarden in de twee voorbeelden omgedraaid. Verder wel een cool idee, dat brengt mij tot het volgende idee:
button(name, url, :use_form, :default)
met deze methode:
(apestaartje is eigenlijk een asterisk)
Die locale variabelen hoef je natuurlijk niet zo te zetten, of misschien is er wel een mooie (meta) oplossing voor te schrijven.
Aan de andere kant, hoe vaak heb je nou zo’n signature op een method?
PS. Uit het blote hoofd, wellicht erg onverstandig:
levert:
Oeps, heb waardes aangepast.
Verder interessant idee! Niet erg praktisch, aangezien, zoals je al zegt, methodes met heel veel boolean parameters weinig voorkomen (in ruby-projecten, in java-projecten is het een heel ander verhaal), maar wel erg leuk.
Het leuke van de
!:icon_only
notatie is dat het in feite een vorm van documentatie is, omdat het exact hetzelfde betekent alsfalse
. Je hoeft dus niets aan de aangeroepen methode te veranderen.Waarom zouden methodes met boolean parameters nou weer veel moeten voorkomen in java projecten? Vrijwel iedere methode die een boolean als parameter heeft riekt naar code smells; die methode doet vast meer dan één ding tegelijk. Volgens mij kun je het beter refactoren naar methodes die de intentie van hetgeen je probeert te doen verduidelijken!
Misschien is een fluent builder wel wat:
Maarja, voor deze specifieke situatie is een hash dan eigenlijk net zo handig inderdaad ;)