Proč je Kotlin úžasný, ale vy stejně zůstanete u Javy
Marcin Perlikowski
Starší vývojář v jazyce Java
Pokud jste vývojářem v jazyce Java, je pravděpodobné, že máte alespoň nějaké zkušenosti s jinými programovými jazyky. Někteří z nás začali své programátorské dobrodružství s jiným jazykem, jako je C/C++, JavaScript, C#, Python nebo možná dokonce něco jako Pascal nebo Basic. Někteří však začínali s Javou a ostatním jazykům se prostě nikdy příliš nevěnovali a nepříjemně vzpomínali na to, jak jednou potřebovali rychle něco nakódovat na straně frontendu.
Bez ohledu na to, do které skupiny patříte, existuje důvod, proč zůstáváte s. Java. A neobviňuji vás. Má pravděpodobně nejrozvinutější, nejuniverzálnější a nejkomplexnější ekosystém v celém světě. podnik svět. Jazyk má pěkně přizpůsobenou sadu schopností, někde na pomezí příliš mnoho a příliš málo. A nové funkce jsou pomalu, ale vytrvale přidávány, což jej většinou udržuje v souladu s novými trendy ve světě programování.
Víte, že Lombok ačkoli? Pokud ne, vřele doporučuji vyzkoušet. Pokud se vám to líbí, pak mám něco právě pro vás k vyzkoušení. Úplně nový jazyk, který svými vlastnostmi dělá Lombok zastaralým. Jmenuje se Kotlin.
Kotlin? Myslíte jazyk pro Android?
Kotlin na Androidu dostal požehnání od samotného Googlu do té míry, že se stal de facto jazykem volby pro tuto platformu. Na to se v tomto článku nezaměřím, ale Android je skutečně místem, kde jsem se s Kotlinem poprvé setkal.
Můj kolega v práci vyvíjel aplikaci pro tehdy aktuální projekt, a to samostatně. Termíny se však rychle blížily, a tak jsem byl pověřen, abych mu je pomohl splnit. Dovolte mi, abych se nyní přenesl v čase zpět do tohoto okamžiku. Aaaand... YUCK! Proč používá nějaký divný jazyk, který zní jako. značka kečupu!? Vypadá to hrozně!
Proč je před každou funkcí napsáno "fun"? Jako bych už nevěděl, co to je. A taky už mám zábava s Java každopádně. A kde je návratový typ? Na konci? Zbláznil ses? Co to je, přiřazuješ něco funkci? To nedává žádný smysl! Všechno to vypadá jako Java s dalšími kroky! Počkat, kam patří třída, do které tato metoda patří? Kam jsi ji schoval, ty kečupově znějící, Java napodobující výmluvu na programovací jazyk? Ale ne. Ale ne, to jste neudělali. JE TO GLOBÁLNÍ FUNKCE? To je vše, končím, volám policii.
Pozor, spoiler: nevolal jsem orgány činné v trestním řízení. Ať už se mi to líbilo, nebo ne, musel jsem své myšlení zaměřené na Javu přizpůsobit jinému jazyku. Nebude to ale tak špatné, ne? Pořád je to jazyk JVM, určitě je to jen jiný. Java. Možná i s nějakými skvělými funkcemi navíc? Neochotně jsem na projektu začal pracovat.
Java s dalšími kroky
Pokud je Java tak skvělá, proč neexistuje Java 2? Vtipy stranou, To je to, co jsem si myslel, pro sebe. Prostě budu předstírat, že Kotlin je Java 2. Nová syntaxe a tak, ale musím se jí naučit dost na to, abych projekt dokončil. Chlapče, ach chlapče, mýlil jsem se.
Po jednom nebo dvou dnech zkoušení jsem si rychle uvědomil, že Kotlin i Java nejsou tak pružné. Pokusy o jejich ohnutí k sobě nevyhnutelně končí tím, že se jeden z nich přetrhne napůl. Začalo být zřejmé, že Kotlin je věc sama o sobě, a to, že funguje na JVM, neznamená z programátorského hlediska téměř nic. (Jen na okraj, umí se také transpirovat do jazyka JavaScriptnebo zkompilovat do nativního binárního souboru).
Pak tedy plán B. Vlastně se seznamte s jazykem. Při prvním čtení dokumentace běhá zkušenému programátorovi Javy mráz po zádech. Například: - dříve zmíněný kontext nejvyšší úrovně alias globální kontext - typy parametrů a návratových typů funkcí uvedené na konci
fun sum(a: Int, b: Int): Int {
return a + b
}
tělem funkce může být výraz (s použitím znaménka rovnosti)
fun sum(a: Int, b: Int) = a + b
příkaz if může poskytnout výsledek
val y = if (x == 1) {
"one"
} else if (x == 2) {
"dva"
} else {
"druhý"
}
Dobře, budu si na to muset zvyknout. Jen jiná syntaxe. Co dalšího můžete nabídnout, pane Kotline?
value?.method() // provést, pokud není null
Dobře, zbavit se if (value == null), bod pro vás. Co ještě máte?
fun check(list: List, alternative: Boolean) = when {
list je LinkedList -> print("linked")
alternative -> print("alternative")
list.size > 50 -> print("big")
else -> print("jiný")
}
Hmm pěkné, by mohlo být užitečné, aby se zabránilo, pokud ostatní bloky, stále se zdá jako trik ačkoli.
objekt SingularObject: Counter() {
var a = 14
fun test() = if (a > 10) "more" else "less"
}
Ok, ten vypadá skutečně užitečně, líbí se mi! Na druhou stranu, singleton mohu vytvořit i v Javě. Možná to nebude tak elegantní, ale není to nic nového. Máš nějaká esa v rukávu? Třeba opravdové těžké údery?
var s: String = null // nezkompiluje se, nenulový typ
Představte si kódovou základnu, kde se nemusíte starat o nulovou bezpečnost. Představte si, že prostě považujete za samozřejmé, že každá reference skutečně obsahuje něco smysluplného. Představte si, že máte jistotu, že každý problém související s nulou je předem vyřešen. Víc si nepředstavujte. Všechny reference v Kotlinu nejsou ve výchozím nastavení nulovatelné. Pokud je chcete učinit nulovatelnými, musíte vědomě učinit toto rozhodnutí a výslovně uvést v kód:
var s: String? = null
Chápu, že v tuto chvíli můžete být k celé myšlence skeptičtí. Jste zvyklí na nulovatelné odkazy. Při kódování je máte v hlavě. Dozvěděli jste se, kde si musíte dávat pozor. Přesně to si myslím. Pocházím z Java, bylo to zpočátku opravdu divné. Jakože, jaký to má smysl? Přece díky tomu zázračně nezmizí všechny související problémy. Jen budu muset všude přidávat "?", zní to jako fuška.
Ale rozhodl jsem se ponořit do jazyka, že? Ať je po vašem, pane Kotlin. Začal jsem se snažit eliminovat co nejvíce nulovatelných proměnných, polí a parametrů. Krok za krokem jsem se naučil používat vlastnosti jazyka, které usnadňovaly eliminaci nulovatelných odkazů, např. operátor safe call "?.", operátor elvis "?:", delegované vlastnosti, metoda "let" a další.
Postupem času se mi podařilo dosáhnout toho, že některé třídy obsahují pouze nenulová pole a parametry metod. V podstatě jsem věděl, že pokud je třída úspěšně instancována, mohu na nulovatelnost v tělech metod téměř zapomenout. Bylo to blaho. Postupem času jsem to oceňoval čím dál víc. Nakonec jsem to však nepovažoval za killer feature, Java se stále cítil jako doma. Dokud...
Návrat
Projekt se blížil ke konci. Stále více jsem poznával Kotlin a díky těmto znalostem byl kód stále úhlednější, čitelnější a stručnější. Zlepšení jste mohli vidět pouhým okem v historii revizí. Nakonec však nadešel čas. S nečekaně příjemnými vzpomínkami na nový jazyk nastal čas rozloučit se a vrátit se do sladké komfortní zóny jazyka Java. Nebo jsem si to alespoň myslel.
Znáte ten pocit, kdy si něčeho začnete vážit až ve chvíli, kdy to zmizí? Když si neuvědomíte, jak moc si na něčem zakládáte, dokud to už nemůžete používat? Byl to ten nejlepší příklad tohoto pocitu, jaký jsem v životě pravděpodobně zažil.
Když jsem se vrátil k psaní kódu v Java, téměř mě vyděsila absence některých funkcí. Bylo to, jako by můj mozek podvědomě, chybně zpětně instaloval funkce Kotlinu do Javy. Zažil jsem situace, kdy jsem skutečně začal něco implementovat, abych zjistil, že to v tomto jazyce nebude fungovat. V nejlepším případě bych to mohl napsat podobně jako Kotlin, ale bylo by to objemné, nečitelné a/nebo by to vyžadovalo příliš mnoho boilerplate.
Nulová bezpečnost byla samozřejmě funkce, která mi chyběla nejvíce. Ale překvapilo mě, kolik menších věcí se pro mě stalo přirozenými: pojmenované parametry, vlastnosti místo getterů a setterů, "==" jako equals a "===" jako referenční rovnost, kvalifikované "this", rozšiřující funkce, implicitní singulární lambda parametr, "_" pro nepoužité lambda parametry, datové třídy, scope funkce, další Kotlin stdlib funkce, operátory a další. A jak to všechno do sebe pěkně zapadá. Ve srovnání s tím mi Java připadala... primitivní.
Vlastně jsem se cítil tak špatně, že jsem začal uvažovat o úplném přechodu na Kotlin. Teoreticky je plně interoperabilní s Javou, stačí přidat podporu Kotlinu do stávajícího projektu a začít psát nové třídy. Strana Kotlinu ví, jak "mluvit" s Javou, a strana Javy ani neví, že "mluví" s jiným jazykem. A po kompilaci do bajtového kódu to pro JVM vlastně není žádný rozdíl.
Kontrola reality
Tak na co čekáte? Pokud je jazyk tak dobrý, jak říkáte, prostě ho používejte! Možná ne v existujících projektech, i když vím, že by měl být interoperabilní, ale míchat takto dva různé jazyky zní ošklivě.
Dobře, takže pro nové moduly - Kotlin je to. Nebo ano? Pracujete v tým. Musíte se s nimi poradit a přesvědčit je o velikosti tohoto nového jazyka. Co? Nelíbí se jim to? To zní, jako by prostě nechtěli vynaložit úsilí, aby se ho naučili. Nemůžete se jim ale divit, vy jste byli zpočátku také skeptičtí.
Projektový manažer! Ano! Určitě pochopí, jak velkou hodnotu by Kotlin našemu týmu přinesl. Ach, ta velikost, která přijde! -No -Počkat, proč? -Tým to neví. -Naučí se to! -Nechtějí se učit. -Můžete je vyrobit! -Nepotřebují se učit. -To je sice pravda, ale představte si ty možnosti! -Ano, co kdybyste se nejprve zamysleli nad problémy.
Legenda říká, že existuje projekt. Projekt, který je velký a složitý, ale pěkně napsaný v každé části. Projekt, kde jsou všichni vývojáři zajedno ohledně použitých řešení. Kde nové funkce jen plynule přicházejí z klávesnic programátorů. Kde jsou chyby vzácné a snadno opravitelné.
Viděli jste někdy takový projekt? Já ne. Některé se tomu blížily, ale většina z nich je velký nepořádek ve starém kódu. A pokud nejsou, pravděpodobně se jím někdy v budoucnu stanou. A teď si představte, že do toho všeho přihodíte další jazyk. Zavádí to nové způsoby, jak dělat chyby. Vyžaduje, aby vývojáři věděli, co dělají. Je to přinejmenším riziko.
Nyní zvažte také rotaci vývojářů. Lidé přicházejí a odcházejí. Budete nutit každého nového vývojáře, aby se naučil celý nový jazyk? Ne, to je kontraproduktivní. Budete najímat především vývojáře pro Kotlin? Tak to hodně štěstí, najmout dobrého vývojáře Javy je dost těžké.
Lidé to zkoušeli. Musím říct, že s většinou tvrzení v tomto článku nesouhlasím. Je tam sice oprávněná kritika, ale myslím, že nepoužívali Kotlin dostatečně na to, aby skutečně pochopili "způsob Kotlinu". Mnoho komentátorů pod tím článkem si zřejmě myslí něco podobného.
Na tom ale nezáleží. Vsadím se, že by se to stalo i ve vašem projektu. "Zkusil jsem to, nelíbilo se mi to". Nedonutíte je, aby nad tím strávili více času. Nedonutíte je, aby to zkusili znovu. Nedonutíte je, aby tomu dali další šanci. A z praktického hlediska mohou mít pravdu. Java je tak populární, že se použití čehokoli jiného v JVM zdá být zbytečné.
Proč tedy tento článek?
Právě jste strávil značné množství času psaním článku, který zřejmě nemá smysl. Proč bych se měl snažit učit jazyk, když stejně tvrdíte, že to nemá smysl?
Nemyslím si, že je to zbytečné. Pořád si myslím, že Kotlin je skvělý. Pořád ho chci skutečně používat (a skutečně ho používám pro své soukromé projekty). Kdybych mohl, prostě bych na něj přešel a zapomněl na omezení Javy. Ale současná realita říká, že nemůžu. A já se to chci pokusit změnit.
Mým záměrem je, abys, milý čtenáři, alespoň zkusil vystoupit z útulné komfortní zóny Javy. Protože možná, jen možná, si Kotlin zamilujete stejně jako já. A pokud ano, bude o jednoho vývojáře znalého Kotlinu více. trh.