Clean Code in Kotlin: Prinzipien und Beispiele für Anfänger
Sauberer Code (Clean Code) ist nicht nur ein modischer Begriff, sondern eine grundlegende Fähigkeit jedes Entwicklers. In der Sprache Kotlin, die Prägnanz und Leistungsfähigkeit vereint, wird das Schreiben von lesbarem und wartbarem Code besonders wichtig. In diesem Artikel analysieren wir die wichtigsten Clean-Code-Prinzipien in Bezug auf Kotlin, geben praktische Beispiele und zeigen, wie man typische Fehler vermeidet. Das Material richtet sich an Anfänger, die von Anfang an professionellen Code schreiben möchten.
1. Benennung von Variablen, Funktionen und Klassen
Die richtige Benennung ist die Grundlage für sauberen Code. Der Name sollte die Fragen beantworten: "Was ist das?" und "Wozu wird es benötigt?". In Kotlin wird camelCase für Variablen und Funktionen sowie PascalCase für Klassen und Objekte verwendet.
Schlechtes Beispiel:
val x = 5fun calc(a: Int, b: Int): Int { return a * b + 10}Gutes Beispiel:
val maxRetryCount = 5fun calculateTotalPrice(basePrice: Int, tax: Int): Int { return basePrice + tax}Wichtige Regeln:
- Vermeiden Sie Abkürzungen —
usrsollte besser durchuserundcalcdurchcalculateersetzt werden. - Verwenden Sie Verben für Funktionen —
getUser(),sendEmail(),validateInput(). - Boolesche Variablen benennen Sie mit den Präfixen
is,has,can—isActive,hasPermission. - Vermeiden Sie überflüssige Informationen —
userListist besser alslistOfUsersFromDatabase.
2. SOLID-Prinzipien in Kotlin
SOLID sind fünf Prinzipien der objektorientierten Programmierung, die helfen, flexible und leicht wartbare Systeme zu erstellen. Betrachten wir sie anhand von Kotlin-Beispielen.
Single Responsibility (Einzelverantwortung)
Eine Klasse sollte nur einen Grund für Änderungen haben. Teilen Sie die Logik in kleine, spezialisierte Klassen auf.
Schlechtes Beispiel:
class UserManager { fun saveUser(user: User) { /* Speichern in der DB */ } fun sendEmail(user: User) { /* E-Mail senden */ } fun printReport(user: User) { /* Bericht drucken */ }}Gutes Beispiel:
class UserRepository { fun save(user: User) { /* Speichern in der DB */ }}
class EmailService { fun send(user: User) { /* E-Mail senden */ }}
class ReportPrinter { fun print(user: User) { /* Bericht drucken */ }}Open/Closed (Offen/Geschlossen)
Klassen sollten für Erweiterungen offen, aber für Modifikationen geschlossen sein. Verwenden Sie Schnittstellen und Vererbung.
interface Shape { fun area(): Double}
class Circle(val radius: Double) : Shape { override fun area() = Math.PI * radius * radius}
class Rectangle(val width: Double, val height: Double) : Shape { override fun area() = width * height}
// Jetzt können neue Formen hinzugefügt werden, ohne den vorhandenen Code zu ändernLiskov Substitution (Liskovsches Substitutionsprinzip)
Objekte von Unterklassen sollten Objekte der Basisklasse ersetzen können, ohne die Logik zu beeinträchtigen. In Kotlin ist dies besonders bei der Arbeit mit Sammlungen und Vererbung relevant.
open class Bird { open fun fly() = "Fliegt"}
class Penguin : Bird() { override fun fly() = throw UnsupportedOperationException("Pinguine fliegen nicht")}// Dies verletzt das Prinzip – besser ist es, die "Flugfähigkeit" in ein separates Interface auszulagern3. Arbeiten mit Funktionen: Prägnanz und Reinheit
Kotlin bietet leistungsstarke Werkzeuge zum Schreiben reiner Funktionen. Die wichtigsten Regeln:
Blogs
Buchempfehlungen
Lesen Sie auch
Django Tutorial: Erste Schritte für Anfänger