1-Dec

Kotlin

Julerengjøring i Kotlin på 5 minutter

“Nå har vi vaska kode, og vi har slettet alt. Og vi har krasja appen, og databasen falt."

Dette var nesten min julelåt da jeg skulle slette litt kode sist. På 5 minutter kan du lære hvordan gjøre det samme OG hvordan du kan unngå å gjøre nøyaktig som meg, men bedre.

4 min read

·

By Johannes Kvamme

·

December 1, 2023

Mange har blitt sitert på ulike varianter av “den eneste feilfrie koden er den som aldri er skrevet”. Jeg mener at alt håp allikevel ikke er ute (beklager, Turistforeningen) selv om koden er skrevet. Spesielt om den ikke lenger er i bruk. Og så er ikke det alltid like lett i alle kodespråk å si om koden faktisk er i bruk. Heldigvis er Kotlin ganske god på dette, siden vi ikke har så mye globale greier (Ja, jeg ser på deg, JavaScript).

Om du allikevel ikke er overbevist om at å slette ubrukt kode er en lur ting, så tenk tilbake. Tilbake til forrige gang du måtte sette deg inn i en ny kodebase. Det er nok av ting å lære seg, om du ikke må lære deg masse kode som ikke gjør noen ting også.

“Ja, men tenk så praktisk denne kodesnutten kan være i fremtiden om noen andre skal løse et lignende problem”. Joda. Men tenk så upraktisk det kan være å finne en kodesnutt med bug i, og det er 20 ulike “paymentHelperFunction()” som i koden din, og 13.5 av de er rene villspor. Så la oss slette litt ubrukt kode. Git husker den uansett.

TL:DR;

“Analyze | Run inspection by name “ og skriv “unused symbol”. Ikke slett enum-verdier eller default-verdier på ting som kommuniserer ut

Hvordan finne død kode?

Det er lekende lett å finne kode som ikke er i bruk med …drømroll… Intellij! 🎉

Og det er mange veier til mål. Min favoritt er den visuelle veien. Selv om jeg ellers foretrekker terminaler og snarveier. Intellij har mange knapper og fancy funksjonalitet, og det er litt cockpit-stemning for min del. Så om det er visuelt tydelig at jeg ikke gjør noe dumt nå, da blir jeg generelt glad.

Vi starter i filutforskeren, standard funnet til venstre i Intellij-en din. Høyreklikk på mappen som inneholder alle filene du vil skanne gjennom. F.eks. `src`. Velg `Analyze` fra menyen og det litt obskure navnet “Run inspection by name”. Her får du et magisk felt du kan skrive regelnavn fra hvilket som helst kodespråk. Veldig brukervennlig med andre ord.

Kodeordet vårt er ikke “simsalabim”, men “unused symbol”. Dette er Kotlins “du-bruker-ikke-denne-greia”-regel. Trykk enter og "OK", og Intellij er i gang. Ubrukt kode vil bli ramset opp i fleng av Intellij, og du kan slette i vei.

Simsalabim!

Jeg lovte også at du skulle kunne unngå å brenne ned prodtreet på julaften med slettingen din. Om du er interessert i å unngå det, så les videre!


Hvordan ikke ta ned prod*

*jeg garanterer ingenting.

Fellesnevneren for fallgruvene jeg har gått i personlig er at de har med ting utenfor min egen kodebase å gjøre. Vi snakker altså gjerne HTTP eller andre alternativer. Heldigvis finnes det ulike måter å håndtere disse på, som du kan lære av meg istedenfor å tråkke i sildesalaten.

Fellesløsningen som du kan bruke uansett hva Kotlin mener er å si “Jeg vet best, hold kjeft.”. Eller @Suppress(“unused symbol”) som det heter på kotlinsk. Er du litt hyggelig med nestemann så legger du også inn en forklaring, eller kanskje til og med en lenke hit? 🤓

Jackson krever at enum-verdier finnes.

Enum-verdier som ikke har noen verdi for din kodebase (🥁) er Kotlin overbevist om at helt trygt å fjerne. Tenker du som meg at Kotlin vet nok best, så venter det en del knall og fall på deg også. Det har seg nemlig slik at Kotlin ikke helt klarer å se at Jackson kanskje kommer til å krasje på manglende enum-verdier. For det er det som er standardoppsettet. Om du absolutt ikke ønsker å ha disse enum-verdiene i koden din har vi heldigvis valgalternativer.

  1. Be de settes til null. Du vil så klart da begynne å måtte håndtere null-verdier i koden og typene dine. Reglen setter du på objectMapperen din (DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
  2. Be de settes til en default-verdi. Det er kanskje en business-case som forklarer hvorfor det finnes masse enum-verdier du gir blanke f* i. Da gir det gjerne mening å gi dette et navn og en egen enum-verdi som sier hvordan det caset skal håndteres. Samme som over så settes dette i objectMapperen. (DeserializationFeature READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
  3. Generer API-klienten din automagisk (f.eks. med en OpenAPI-kodegenerator) og hold den genererte koden utenfor mappen du ber Intellij lete gjennom.

Default-verdier som aldri blir satt til noe annet

Ubrukt sier Kotlin, ubrukt sier du, 400 Bad request sier mottakeren av API-requestet ditt. Om API-et du skal snakke med krever at et felt blir satt av deg, og ikke at de har satt en standardverdi på sin side, så kan du igjen gå i baret. Igjen kan du reddes av genererte API-klienter. Ellers er suppress igjen din venn.