Kodėl "Kotlin" yra nuostabi, bet vis tiek liksite su "Java
Marcin Perlikowski
Vyresnysis "Java" programuotojas
Jei esate "Java" programuotojas, tikėtina, kad turite bent šiek tiek patirties su kitomis programavimo kalbomis. Kai kurie iš mūsų savo programavimo nuotykius pradėjo nuo kitos kalbos, pavyzdžiui, C/C++, JavaScript, C#, Python, o gal net nuo "Pascal" ar "Basic". Tačiau kai kurie pradėjo nuo "Java" ir tiesiog niekada per daug nesigilino į kitas kalbas, nemaloniai prisimindami tą vienintelį kartą, kai reikėjo greitai užkoduoti ką nors iš frontend pusės.
Nepriklausomai nuo to, kokiai grupei priklausote, yra priežastis, dėl kurios liekate su Java. Ir aš jūsų nekaltinu. Ji turi bene labiausiai išvystytą, universalią ir išbaigtą ekosistemą visoje įmonė pasaulis. Kalba turi gražiai pritaikytą galimybių rinkinį, kuris yra tarp per daug ir per mažai. Lėtai, bet nuolat pridedamos naujos funkcijos, todėl kalba dažniausiai atitinka naujausias programavimo pasaulio tendencijas.
Ar žinote Lombokas tačiau? Jei ne, labai rekomenduoju pabandyti. Jei patiks, turiu ką nors, ką galite išbandyti. Visiškai naują kalbą, kuri savo savybėmis lomboką paverčia atgyvena. Ji vadinasi Kotlin.
Kotlin? Turite omenyje "Android" kalbą?
"Kotlin" "Android" sistemoje palaimino pati "Google" ir ji tapo de facto pasirinkta šios platformos kalba. Šiame straipsnyje daugiausia dėmesio skirsiu ne tam, bet "Android" iš tiesų yra ta vieta, kur pirmą kartą susipažinau su "Kotlin".
Mano kolega darbe kūrė programėlę tuometinei projektas, savarankiškai. Tačiau terminai sparčiai artėjo, todėl man buvo pavesta padėti jam jų laikytis. Dabar leiskite man persikelti į tą akimirką. Aaaand... YUCK! Kodėl jis vartoja kažkokią keistą kalbą, kuri skamba kaip kečupo prekės ženklas!? Atrodo siaubingai!
Kodėl prieš kiekvieną funkciją rašoma “fun”? Tarsi aš dar nežinočiau, kas tai yra. Be to, aš jau turiu įdomus su Java bet kokiu atveju. O kur yra grąžinimo tipas? Pabaigoje? Ar jūs išprotėjote? Tai ką, jūs kažką priskiriate funkcijai? Tai neturi jokios prasmės! Viskas atrodo taip Java su papildomais žingsniais! Palaukite, kur yra klasė, kuriai priklauso šis metodas? Kur jį paslėpėte, kečupas skamba, Java imituojanti programavimo kalbos pasiteisinimą? O ne. O ne, ne jūs. AR TAI GLOBALI FUNKCIJA? Štai ir viskas, baigta, skambinu į policiją.
Spoileris: neskambinau teisėsaugai. Patiko man tai ar ne, bet turėjau pakoreguoti savo į Java orientuotą mąstyseną, kad prisitaikyčiau prie kitos kalbos. Tačiau tai nebus taip blogai, tiesa? Tai vis dar JVM kalba, be abejo, tai tiesiog kitokia Java. Gal net su kai kuriomis šauniomis papildomomis funkcijomis? Nenoromis pradėjau dirbti prie projekto.
"Java" su papildomais veiksmais
Jei "Java" tokia puiki, kodėl nėra "Java 2"? Juokas į šalį, Tai, ką aš maniau sau. Tiesiog apsimesiu, kad Kotlin yra Java 2. Nauja sintaksė ir visa kita, bet turiu išmokti tiek, kad galėčiau užbaigti projektą. Vaikeli, oi, vaikeli, aš klydau.
Išbandęs ją vos vieną ar dvi dienas, greitai supratau, kad ir "Kotlin", ir Java nėra tokie elastingi. Mėginant jas sulenkti vieną į kitą, viena iš jų neišvengiamai lūžta per pusę. Tapo akivaizdu, kad Kotlin yra atskiras dalykas, o tai, kad ji veikia JVM, programuotojo požiūriu beveik nieko nereiškia. (Beje, ji taip pat gali persiųsti į JavaScript, arba būti sukompiliuotas į vietinę dvejetainę versiją).
Tada planas B. Tiesą sakant, išmokti kalbą. Pirmą kartą skaitant dokumentus, patyrusiam "Java" programuotojui per nugarą perbėga šiurpuliukai. Pavyzdžiui: - anksčiau minėtas aukščiausio lygio dar žinomas kaip visuotinis kontekstas. - pabaigoje nurodyti parametrų ir funkcijų grąžinimo tipai.
fun sum(a: Int, b: Int): Int {
return a + b
}
funkcijos kūnas gali būti išraiška (naudojant lygybės ženklą)
fun sum(a: Int, b: Int) = a + b
if teiginys gali duoti rezultatą
val y = if (x == 1) {
"vienas"
} else if (x == 2) {
"du"
} else {
"kitas"
}
Gerai, man tiesiog reikės prie to priprasti. Tiesiog kitokia sintaksė. Ką dar galite pasiūlyti, pone Kotlinai?
value?.method() // įvykdyti, jei ne null
Gerai, atsikratyti jei (value == null), taškas jums. Ką dar turite?
fun check(list: List, alternative: Boolean) = when {
list is LinkedList -> print("linked")
alternative -> print("alternative")
list.size > 50 -> print("big")
else -> print("other")
}
Hmm gražus, gali būti patogu išvengti, jei kiti blokai, vis dar atrodo kaip triukas, nors.
objektas SingularObject: Skaitiklis() {
var a = 14
fun test() = if (a > 10) "daugiau" else "mažiau"
}
Gerai, šis atrodo tikrai naudingas, man patinka! Kita vertus, "Java" taip pat galiu sukurti singletoną. Galbūt jis nebus toks elegantiškas, bet tai tikrai nieko naujo. Ar turite kokių nors tūzų rankovėje? Pavyzdžiui, tikrų sunkiasvorių?
var s: String = null // nekompilatuoja, ne nulinis tipas
Įsivaizduokite kodų bazę, kurioje nereikia rūpintis nuliniu saugumu. Įsivaizduokite, kad laikoma savaime suprantamu dalyku, jog kiekviena nuoroda iš tikrųjų yra kažkas prasmingo. Įsivaizduokite, kad esate tikri, jog visos su nulinėmis nuorodomis susijusios problemos sprendžiamos iš anksto. Daugiau neįsivaizduokite. Pagal nutylėjimą visos Kotlin nuorodos nėra nulinės. Jei norite, kad jos būtų nulinės, turite sąmoningai priimti tokį sprendimą ir aiškiai nurodyti jį kodas:
var s: String? = null
Suprantu, kad šiuo metu galite skeptiškai vertinti visą šią idėją. Esate pripratę prie nulinių nuorodų. Kodavimo metu tai įsidėmėjote galvoje. Sužinojote, kur reikia būti atsargiems. Mano mintys būtent tokios. Iš Java, iš pradžių iš tiesų buvo keista. Pavyzdžiui, kokia prasmė? Juk dėl to stebuklingai neišnyks visos susijusios problemos. Man tiesiog reikės visur pridėti “?”, skamba kaip darbas.
Bet aš nusprendžiau pasinerti į kalbą, ar ne? Tegul būna kaip jums, pone Kotlin. Pradėjau stengtis pašalinti kuo daugiau nulinių kintamųjų, laukų ir parametrų. Žingsnis po žingsnio išmokau naudotis kalbos savybėmis, kurios palengvino nulinių nuorodų pašalinimą, pvz., saugaus iškvietimo “?.” operatoriumi, elvis “?:” operatoriumi, deleguotomis savybėmis, “let” metodu ir kt.
Laikui bėgant pavyko pasiekti, kad kai kuriose klasėse būtų tik ne nuliniai laukai ir metodų parametrai. Iš esmės žinojau, kad jei klasė buvo sėkmingai instancuota, galiu beveik pamiršti apie metodų kūnų nulines reikšmes. Tai buvo palaima. Laikui bėgant tai vis labiau vertinau. Tačiau galiausiai negalvojau apie tai kaip apie žudančią funkciją, Java vis dar jautėsi kaip namie. Kol...
Sugrįžimas
Projektas artėjo prie pabaigos. Vis geriau pažinau "Kotlin", o įgijus šių žinių kodas darėsi vis tvarkingesnis, skaitomesnis ir glaustesnis. Patobulinimus plika akimi galėjai pamatyti įrašų istorijoje. Tačiau pagaliau atėjo laikas. Su netikėtai maloniais prisiminimais apie naująją kalbą atėjo laikas atsisveikinti ir grįžti į saldžią komforto zoną Java. Bent jau taip maniau.
Ar pažįstate tą jausmą, kai pradedate vertinti daiktą tą pačią akimirką, kai jo nebėra? Kai nesuvokiate, kaip labai nuo ko nors priklausote, kol nebegalite juo naudotis? Tai buvo pats geriausias šio jausmo pavyzdys, kokį turbūt esu patyręs gyvenime.
Kai grįžau prie kodo rašymo Java, mane beveik išgąsdino kai kurių funkcijų trūkumas. Atrodė, tarsi mano smegenys pasąmoningai, neteisingai Kotlin funkcijas būtų perkėlusios į Java. Patyriau situacijų, kai iš tikrųjų pradėjau ką nors įgyvendinti, kad suprasčiau, jog šioje kalboje tai neveiks. Geriausiu atveju galėčiau ją parašyti kaip Kotlin, bet ji būtų gremėzdiška, neskaitoma ir (arba) reikalautų per daug šablonų.
Nulinė apsauga, žinoma, buvo funkcija, kurios man labiausiai trūko. Tačiau nustebau, kiek daug mažesnių dalykų man tapo savaime suprantami: įvardyti parametrai, savybės vietoj getterių ir setterių, “==” kaip lygybė ir “===” kaip referencinė lygybė, kvalifikuotas “this”, išplėtimo funkcijos, numanomas vienintelis lambda parametras, “_” nenaudojamiems lambda parametrams, duomenys klases, apimties funkcijas, kitas Kotlin stdlib funkcijas, operatorius ir dar daugiau. Ir kaip visa tai gražiai dera tarpusavyje. Palyginimui, Java atrodė... primityvi.
Iš tikrųjų jaučiausi taip blogai, kad ėmiau svarstyti galimybę apskritai pereiti prie “Kotlin”. Teoriškai ji visiškai sąveikauja su “Java”, galima tiesiog pridėti "Kotlin" palaikymą prie esamo projekto ir pradėti rašyti naujas klases. Kotlin pusė žino, kaip "kalbėtis" su Java, o Java pusė net nežino, kad "kalbasi" su kita kalba. O po kompiliavimo į baitkodą JVM iš tikrųjų nedaro jokio skirtumo.
Realybės patikrinimas
Tad ko laukiate? Jei kalba yra tokia gera, kaip sakote, tiesiog ja naudokitės! Tačiau gal ne esamuose projektuose, žinau, kad ji turėtų būti sąveikaujanti, bet taip maišyti dvi skirtingas kalbas skamba negražiai.
Gerai, tad naujiems moduliams - Kotlin. Arba taip? Jūs dirbate komanda. Turite su jais pasitarti ir įtikinti juos šios naujos kalbos didingumu. Ką? Jiems ji nepatinka? Panašu, kad jie tiesiog nenori dėti pastangų jos mokytis. Tačiau negalite jų kaltinti, iš pradžių ir jūs buvote skeptiškas.
Projekto vadovas! Taip! Jis tikrai supras, kokią didelę vertę Kotlin atneštų mūsų team. O, kokia didybė ateis! -Nuo -Palaukite, kodėl? -team to nežino. -Jie išmoks! -Jie nenori mokytis. -Jūs galite juos pasigaminti! -Jiems nereikia mokytis. -Tai tiesa, bet pagalvokite apie galimybes! -Taip, o gal pirmiausia pagalvokite apie problemas?.
Legendoje sakoma, kad egzistuoja projektas. Projektas, kuris yra didelis ir sudėtingas, bet gražiai parašytas kiekvienoje dalyje. Projektas, kuriame visi kūrėjai vieningai kalba apie naudojamus sprendimus. Kur naujos funkcijos tiesiog sklandžiai liejasi iš programuotojų klaviatūrų. Kur klaidos pasitaiko retai ir jas lengva ištaisyti.
Ar esate matę tokį projektą? Nemačiau. Kai kurie buvo artimi, bet dauguma jų yra didelė paveldėto kodo netvarka. O jei ir nėra, greičiausiai kada nors ateityje taps. O dabar įsivaizduokite, kad į šią mišrainę įmaišysite dar vieną kalbą. Ji suteikia naujų būdų daryti klaidas. Ji reikalauja, kad kūrėjai žinotų, ką daro. Tai, švelniai tariant, rizika.
Dabar taip pat atsižvelkite į kūrėjas rotacija. Žmonės ateina ir išeina. Ar priversite kiekvieną naują kūrėją mokytis visiškai naujos kalbos? Ne, tai būtų neproduktyvu. Ar pirmiausia samdysite "Kotlin" kūrėjus? Sėkmės, nes pasamdyti gerą "Java" programuotoją pakankamai sunku.
Žmonės bandė. Turiu pasakyti, kad nesutinku su daugeliu tame straipsnyje pateiktų kaltinimų. Ten yra pagrįstos kritikos, bet manau, kad jie nenaudojo Kotlin pakankamai, kad iš tikrųjų suprastų “Kotlin būdą”. Panašu, kad daugelis komentatorių po tuo straipsniu mano panašiai.
Tačiau tai nesvarbu. Galiu lažintis, kad taip nutiktų ir jūsų projekte. “Išbandžiau, nepatiko”. Jų nepriversite tam skirti daugiau laiko. Nepriversite jų pabandyti dar kartą. Nepriversite jų suteikti jam dar vieną šansą. Ir praktiniu požiūriu jie gali būti teisūs. Java yra toks populiarus, kad bet ko kito naudojimas JVM atrodo nereikalingas.
Kodėl šis straipsnis?
Ką tik praleidote nemažai laiko rašydami straipsnį, kuris, atrodo, neturi prasmės. Kodėl turėčiau bandyti mokytis kalbos, jei sakote, kad tai vis tiek beprasmiška?
Nemanau, kad tai beprasmiška. Vis dar manau, kad "Kotlin" yra puiki. Aš vis dar noriu ją naudoti (ir iš tikrųjų ją naudoju savo privačiuose projektuose). Jei galėčiau, tiesiog pereičiau prie jos ir pamirščiau "Java" apribojimus. Tačiau dabartinė realybė sako, kad negaliu. Ir aš noriu pabandyti tai pakeisti.
Mano ketinimas jums, gerbiamas skaitytojau, yra bent jau apsvarstyti galimybę išeiti iš jaukios "Java" komforto zonos. Nes galbūt, tik galbūt, jums Kotlin patiks taip pat, kaip ir man. O jei taip, tai dar vienas Kotlin išmanantis kūrėjas rinka.