»Hvorfor har du et break i hvert af dine case-udtryk? Er det rigtigt?«
Nogenlunde sådan lød spørgsmålet fra en kollega henover skrivebordene på redaktionen. I virkeligheden lød det nok mindre pænt og mere anklagende, men under alle omstændigheder endte jeg med at måtte forklare, hvorfor switch er sådan en sær størrelse. Altså en god dag på kontoret.
Nu havde jeg brugt en switch i et script, jeg havde lavet, som skulle gøre det nemt at konvertere tal til superscript og subscript ved hjælp af Unicode, som vores database for nylig blev opdateret til at understøtte.
Heldigvis havde jeg læst dette grundige blogindlæg om 'The curious case of the switch statement', så jeg var klædt på til at imødegå kritikken og hurtigt svare, at ja, det er helt godnat med de der breaks.
Switch er lidt et problembarn i de fleste programmeringssprog. I modsætning til basal logik som if eller løkker som for og while, så er switch en mærkelig blanding, der hverken er det ene eller det andet, og man kan opnå samme resultat uden af gøre brug af switch.
Min switch var i Javascript, som følger den mest udbredte måde at skrive en switch på, og det store problem er, at i de fleste sprog har switch en syntaks, der er lige en lille smule ved siden af, hvad man ville forvente i forhold til den gængse syntaks i sproget.
Det bliver noget med case og så hverken parenteser eller klammer, men et kolon, og hver case afsluttes med et break, som ikke helt er et rigtigt break, men i stedet fremstår som noget, der er efterladt fra en arkaisk kodestil.
Jeg er altid nødt til lige at slå syntaksen op, når jeg kaster mig ud i en switch.
Switchen er da også lidt arkaisk med rødder tilbage til sprog, hvor alt blev skrevet med store bogstaver.
Den dufter dog dejligt af at spare på nogle helt basale maskininstruktioner ved at bruge noget, der nærmest er labels og goto'er, på en måde, der virker meget forbudt for dem, der kommer fra de sprog, hvor sådan noget regnes for at være uartigt.
I mit javascript kunne jeg da også have løst opgaven med bare min for-løkke og et passende Regex-udtryk eller en dictionary og noget if-halløj. Det var imidlertid en klassisk case for en switch.
Det, jeg godt kan lide ved en switch, er, at den viser, hvad den gør. Ok, syntaksen er noget rod, men når man overvinder dét, så er en switch let at læse.
Og jeg føler, at jeg instruerer computeren i at gøre noget, i modsætning til sådan noget som this.getSomething(that.doThisFirst(ImAValueOrMaybeAnObject)) hvor jeg mest krydser fingre for, at jeg har forstået dokumentationen korrekt, og nogen sørger for, at jeg har brugt nok parenteser.
Det, jeg er mindre vild med i min egen implementering, er, at jeg har gentaget næsten enslydende kode over 10 afsnit. Det kunne jeg selvfølgelig have rykket ud i en funktion for sig selv - på bekostning af lidt læsbarhed.
Der findes erklærede switch-modstandere, og den er da også lidt bøvlet. Men try-catch er også bøvlet og mærkeligt. Og én eller anden burde have sagt stop, da nogen i fuld alvor foreslog === som en løsning på noget som helst.