Kotlin: Zwei Welten in einer Sprache
\n\nHaben Sie sich jemals gefragt, warum manche Entwickler Kotlin wie ein verbessertes Java schreiben, während andere den Code in eine Kaskade von Lambdas und Methodenketten verwandeln? Die Antwort ist einfach: Kotlin ist eine multiparadigmatische Sprache, die sowohl mit objektorientierter Programmierung (OOP) als auch mit funktionaler Programmierung (FP) hervorragend harmoniert.
\n\nDoch wie kann sich ein Anfänger in dieser Vielfalt zurechtfinden? Und wie vermeidet ein erfahrener Entwickler, aufgrund der Stilvermischung in „Spaghetti-Code“ zu verfallen? In diesem Artikel analysieren wir, worin sich diese Ansätze unterscheiden, wo und welcher angewendet werden sollte und wie Kotlin hilft, die besten Eigenschaften beider zu vereinen. Machen Sie sich bereit: Es wird viel Code geben und keine Langeweile.
\n\nWenn Sie Kotlin für die Android-Entwicklung oder das Backend lernen, ist das Verständnis dieser Paradigmen Ihr Ticket zu sauberem, lesbarem und wartbarem Code. Los geht's!
\n\nObjektorientiertes Kotlin: Klassik in moderner Hülle
\n\nDer objektorientierte Ansatz dreht sich um Entitäten. Sie haben Klassen, Klassen haben Eigenschaften und Methoden. Alles, was das Programm tut, ist die Interaktion von Objekten. Kotlin übernimmt das Beste aus Java, fügt aber syntaktischen Zucker hinzu: data class, object, faule Eigenschaften und vieles mehr.
Klassen und Vererbung: Ein Beispiel
\n\nStellen Sie sich vor, wir schreiben ein System für einen Online-Shop. Der OOP-Ansatz würde so aussehen:
\n\n// Basisklasse\nopen class Product(val name: String, val price: Double) {\n open fun getDescription(): String {\n return "$name kostet $price Rubel."\n }\n}\n\n// Vererbung\nclass DiscountedProduct(name: String, price: Double, val discount: Double) : Product(name, price) {\n override fun getDescription(): String {\n val finalPrice = price * (1 - discount / 100)\n return "$name mit Rabatt $discount% kostet ${"%.2f".format(finalPrice)} Rubel."\n }\n}\n\nfun main() {\n val apple = Product("Apfel", 50.0)\n val saleApple = DiscountedProduct("Apfel", 50.0, 20.0)\n \n println(apple.getDescription()) // Apfel kostet 50.0 Rubel.\n println(saleApple.getDescription()) // Apfel mit Rabatt 20% kostet 40.00 Rubel.\n}\n\nHier ist alles logisch: Es gibt eine Hierarchie, Polymorphismus, Kapselung. Aber es gibt auch Nachteile: Der Code wird schwerfällig, wenn es viele Klassen gibt. Und wenn wir einfach einen Rabatt auf jedes Produkt anwenden müssen, müssten wir Unterklassen erzeugen.
\n\nWann ist OOP die richtige Wahl?
\n- \n
- Komplexe Geschäftsmodelle – wenn Entitäten viele Zustände und Verhaltensweisen haben. \n
- UI-Komponenten – Activity, Fragment, View – all das ist klassische OOP. \n
- Datenbankarbeit – ORM (z. B. Room) nutzt Reflexion und Annotationen, die an Klassen gebunden sind. \n
Funktionales Kotlin: Prägnanz und Sicherheit
\n\nFunktionale Programmierung dreht sich um Berechnungen, nicht um Zustände. Anstatt Objekte zu verändern, verwenden wir unveränderliche Daten und reine Funktionen. Kotlin zwingt Sie nicht, im funktionalen Stil zu schreiben, stellt aber alle Werkzeuge dafür bereit: Lambdas, Funktionen höherer Ordnung, monadenartige Konstrukte (z. B. Result).
Funktionen höherer Ordnung: Ein Beispiel
\n\nLösen wir dieselbe Aufgabe mit Rabatten, aber funktional:
\n\ndata class Product(val name: String, val price: Double)\n\nfun applyDiscount(discount: Double): (Product) -> Product = { product ->\n val finalPrice = product.price * (1 - discount / 100)\n product.copy(price = finalPrice)\n}\n\nfun main() {\n val apple = Product("Apfel", 50.0)\n val saleApple = applyDiscount(20.0)(apple)\n \n println("${apple.name} kostet ${apple.price} Rubel.") // Apfel kostet 50.0 Rubel.\n println("${saleApple.name} mit Rabatt kostet ${saleApple.price} Rubel.") // Apfel mit Rabatt kostet 40.0 Rubel.\n}\n\nBeachten Sie: Wir erstellen keine neue Klasse. Wir übergeben die Daten einfach durch die Funkti