Wie Seniors Ihren Kotlin-Code sehen: Analyse anhand realer Beispiele
\n\nSie haben Code geschrieben, in das Repository gepusht und warten mit angehaltenem Atem auf die Freigabe. Doch statt des grünen Hakens erhalten Sie ein Dutzend Kommentare vom Senior-Entwickler. Kommt Ihnen das bekannt vor? Wenn Sie in Kotlin programmieren, sind Sie sicherlich schon in die Situation geraten, dass Ihr scheinbar perfekter Code nach einem Code-Review zum Kürbiss wird.
\n\nIn diesem Artikel analysieren wir, welche typischen Anmerkungen von Seniors am häufigsten bei Code-Reviews in Kotlin vorkommen. Wir werden Ihnen nicht die Syntax beibringen – wir zeigen Ihnen, wie Sie so schreiben, dass Ihr Code beim ersten Mal durch das Review kommt. Los geht's!
\n\n1. Null Safety: „Warum verwendest du nicht den Elvis-Operator?“
\n\nEine der Hauptfunktionen von Kotlin ist die Null Safety. Aber viele Entwickler, insbesondere diejenigen, die von Java kommen, schreiben weiterhin Code im Stil „prüfe-auf-null-und-führe-aus“. Seniors sehen das sofort.
\n\nSchlechtes Beispiel (Java-Stil)
\nfun getUserName(user: User?): String {\n return if (user != null) {\n user.name\n } else {\n "Unknown"\n }\n}\n\nGutes Beispiel (Kotlin-Stil)
\nfun getUserName(user: User?): String {\n return user?.name ?: "Unknown"\n}\n\nDie Verwendung des Elvis-Operators (?:) und des Safe Calls (?.) macht den Code prägnant und lesbar. Seniors lieben es, wenn Sie Zeilen sparen, ohne an Klarheit zu verlieren. Merken Sie sich: if (x != null) { ... } else { ... } ist ein No-Go.
2. Extension Functions: „Wo sind deine Utilities?“
\n\nWenn Sie eine statische Utility-Klasse im Stil von StringUtils.capitalize(str) sehen, wird ein erfahrener Kotlin-Entwickler das Gesicht verziehen. Extension Functions sind das, was Kotlin so elegant macht.
Schlechtes Beispiel
\nobject StringUtils {\n fun capitalize(text: String): String {\n return text.replaceFirstChar { it.uppercase() }\n }\n}\n\n// Verwendung\nval result = StringUtils.capitalize("hello")\n\nGutes Beispiel
\nfun String.capitalizeFirst(): String {\n return this.replaceFirstChar { it.uppercase() }\n}\n\n// Verwendung\nval result = "hello".capitalizeFirst()\n\nSeniors werden sagen: „Warum erstellst du ein Müll-Objekt? Erweitere einfach die Klasse!“ Verwenden Sie Extension Functions – das verbessert die Lesbarkeit und folgt den Kotlin Best Practices.
\n\n3. Sealed Classes statt Enum: „Dein Enum ist veraltet“
\n\nEnums in Kotlin sind gut, aber Sealed Classes bieten wesentlich mehr Flexibilität. Besonders dann, wenn verschiedene Datentypen in einer Hierarchie gespeichert werden müssen.
\n\nSchlechtes Beispiel (Enum)
\nenum class Result {\n SUCCESS,\n ERROR,\n LOADING\n}\n\nfun handleResult(result: Result) {\n when (result) {\n Result.SUCCESS -> // ...\n Result.ERROR -> // ...\n Result.LOADING -> // ...\n }\n}\n\nGutes Beispiel (Sealed Class)
\nsealed class Result {\n data class Success(val data: List<Item>) : Result()\n data class Error(val message: String, val code: Int) : Result()\n object Loading : Result()\n}\n\nfun handleResult(result: Result) {\n when (result) {\n is Result.Success -> println("Data: ${result.data}")\n is Result.Error -> println("Error: ${result.message}")\n Result.Loading -> println("Loading...")\n }\n}\n\nSenior-Entwickler werden es zu schätzen wissen, dass Sie Sealed Classes zur Darstellung von Zuständen verwenden. Dies ist einer der wichtigsten Tipps von Senior Kotlin – machen Sie Typhierarchien explizit.
\n\n4. Scope Functions: „Du hast let, apply und run vergessen“
\n\nScope Functions (let, apply, run, with, also) sind mächtig