De elf rollen van variabelen

Vraag je je tijdens het lezen van code wel eens af: wat doet deze variabele hier precies?

Het antwoord is waarschijnlijk: ja, maar alleen als de rol van die variabele volslagen onduidelijk is, de eerste keer wanneer je ogen over de code glijden. - Dat zou mijn antwoord zijn, althans.

Nadenken

En dat is ook logisch. Goed geschreven code is immers code die je niet laat nadenken. Goede code gaat gepaard met een hum bij elke regel: “Hm oké oké, makes sense, oké…” Sterker nog, in één van de eerste hoofdstukken van Robert C. Martins Clean Code wordt het titelbegrip zelfs gedefinieerd als code die je niet laat nadenken.

Pas wanneer de vanzelfsprekendheid van code in het geding komt, gaan we nadenken - écht nadenken - over wat er op je scherm staat en waarom. Pas dan wordt de vraag waar ik mee begon relevant. Goed, vraag jezelf nu eens af: als dat moment komt, hoe beschrijf je de rol van een variabele dan? - Heb je enig idee waar je moet beginnen bij het beantwoorden van die vraag?

Misschien wel, misschien niet. Ik vermoed dat als ik twintig ontwikkelaars om een antwoord zou vragen, ik twintig verschillende antwoorden zou krijgen.

Generiek, specifiek

Waarom? Als we het over variabelen hebben, dan hebben we het daar ofwel in extreem generieke termen over, ofwel in extreem specifieke. We spreken ofwel van fields of variables of het datatype: string, integer etc., ofwel van nrOfRecords, validationResult, customerAddress etc..

Maar “Het is een method scoped variabele” is natuurlijk geen antwoord op de vraag welke rol die variabele speelt. En hetzelfde geldt voor “Dat is het validationResult”. Dat is wat er staat, inderdaad, maar waarom staat het daar? - Het staat elke ontwikkelaar vrij om op geheel eigen wijze die vraag te beantwoorden.

Elf rollen

In The Programmer’s Brain van Felienne Hermans vond ik een interessante manier om de rol van variabelen te categoriseren. Hermans citeert Jorma Sajaniemi van de Universiteit van Oost-Finland. Volgens hem zijn vrijwel alle variabelen onder te brengen in elf rollen.

Die luiden als volgt1:

Gedeelde taal

De rollen die Sajaniemi definieert, zijn niet door hem uitgevonden. Ze beschrijven patronen die steeds opnieuw terugkeren in verschillende codebases, over verschillende programmeerparadigma’s heen.

Het doel van de lijst is dan ook niet om nieuwe informatie te verschaffen, maar om labels te geven aan dat wat ontwikkelaars intuïtief al vaak aanvoelen. De rollen creëren een gedeelde taal om over variabelen te spreken.

In die zin hebben ze veel weg van ontwerppatronen. Ook ontwerppatronen worden immers niet uitgevonden, maar ontdekt. En primaire doel van het vastleggen van ontwerppatronen, is om ontwikkelaars een manier te geven om eenvoudig over bepaalde oplossingen te kunnen praten. Je zou Sajaniemi’s rollen kunnen zien als een soort mini-ontwerppatronen, toegepast op variabelen.

Vragen

Dus de volgende keer als je je afvraagt: wat doet deze variabele hier precies? - stel jezelf dan eens de volgende vragen: is het een contante? Wordt er hier tijdelijk iets opslagen, misschien? Of wordt er op een conditie gecheckt?

En als je collega je tijdens een code review het vuur aan de schenen legt, zeg dan: “Dit is een walker (of een gatherer of een organizer). Misschien geven die twintig ontwikkelaars in de toekomst dan wel twintig keer hetzelfde antwoord wanneer ze worden gevraagd naar de rol van een variabele!


  1. Ik hanteer de Engelse benamingen om de potentie van die rollen als gedeelde taal te maximaliseren. In deze vorm zouden ze immers ook in code vastgelegd kunnen worden. Hermans maakt enkele interessante opmerkingen hierover in relatie tot de Hongaarse notatie↩︎

boeken · clean code · intentie van code · ontwerppatronen · variabelen