S tymito vlastnostami som sa stretol v scale a uplne zmenili moj pohlad na programovanie. Je az neuveritelne ako velmi sa da "zhustit" kod bez toho, aby nejako vyrazne utrpela jeho citatelnost a som prekvapeny, ze paradigmy, ktore su take stare sa zacinaju do programovacich jazykov dostavat az teraz.
Pre mna velmi zaujimavy clanok - z pohladu scalistu porovnavam a zistujem ci nam v scale nieco nechyba ;-) - zatial je to az prekvapivo podobne.
Dakujem za clanok a tesim sa na druhu cast.
Je toho viac, namatkou napriklad Apache Spark je pomerne znamy a uspesny projekt v oblasti BigData. Myslim, ze hlavne vdaka nemu scala dost prerazila v tejto oblasti a je casto pouzivana na datovu analytiku (mam pocit, ze hned za pythonom, ale statistiky som nevidel).
Okrem toho je scala vynikajuca na tvorbu microservices - frameworky ako play, slick, akka, ZIO, http4s, quill, doobie,...
Co sa tyka Kotlinu, jeho uspech je imho dany skor tym, ze je navrhnuty ako "lepsia" Java, cize javisti (a nielen oni) si ho vedia pomerne rychlo osvojit a zacat v nom pracovat, zatial co prechod z javy (prip. ineho podobneho jazyka) do scaly si vyzaduje trocha viac casu a zmenu myslenia (viem o com hovorim ;-)), co sa, zial, nie kazdemu uplne chce.
Ještě jsem do něj tak úplně nepronikl, ale co zatím potkal:
- Možnost vrátit se jedním returnem o několik úrovní výš (return@neco)
- Možnost nadefinovat interface, pak tomuhle interfacu (!) v úplně jiném a nesouvisejícím souboru dodefinovat implementaci metody (!) a tu následně volat. Myslím, že se snad dá dodělat i implementace co je viditelná pouze v rámci jedné třídy (?)
- Companion objekty asi OK, ale že se metody objektu vnořeného do třídy objeví na třídě samotné je za hodně WTF
- Když dávám lambdu, tak jako parametr nějaké funkce, tak někdy (!) napíšu tu funkci ale bez (), naopak za její jméno napíšu složenatky {} a do nich tu lambdu.
- Když má funkce jeden parametr, tak ho nemusím deklarovat, ale můžu na něj odkázat pomocí "it".
Třeba tady je takový "hezký" kousek kódu:
something.fold({ it }) { return@synchronized Result.error(it) }
(Pokud to dobře chápu) tak ve skutečnosti jsou to ve složenatkách dva parametry pro tu funkci, akorát jeden z nich je v závorkách a druhý je napsaný jako že je za funkcí, ale vlastně je to stále její paraetr (WTF?!) Používá se magické "it", v prvním případě se nějak magicky vrátí bez nutnosti napsat tam explicitně return, ve druhé případě je ale return asi nutný (a navíc je to varianta co vyskakuje o několik úrovní výš).
8. 2. 2022, 14:39 editováno autorem komentáře
“tak ve skutečnosti jsou to ve složenatkách dva parametry pro tu funkci, akorát jeden z nich je v závorkách a druhý je napsaný jako že je za funkcí, ale vlastně je to stále její paraetr (WTF?!)”
Hehe, to je vskutku matoucí, ale má to i Swift nebo Julia (ta dává za volání funkce první argument, ne poslední, because why not…). To s těmi “dalekými” návraty má tuším Smalltalk a Ruby to má taky nějak divně. Je to prostě jakoby výjimka s unwindingem zásobníku, jen to není spojené s žádnou chybou.
Já tedy ne. Naopak, Typescript považuji za prakticky dokonalý (*) jazyk pro to, co v něm dělám, protože je mocný a přitom jednoduchý a přímočarý.
*) Krom legacy featur typu automatické konverze typů, jejichž nepoužívání kontrolujeme lintem. A krom prototype-based inheritance, ale já stejně inklinuji spíš k funkcionálnímu stylu, třídy vlastně aktivně nepoužívám.
BTW, teď jsem přišel na jednu takovou zajímavou věc. Pokud mám nullable variable, tak u kódu:
if (someObject == null) {
// something
} else {
// else
someObject.whatever
}
v else větvi Typescript ví, že proměnná je not null a tedy je ji možno bezpečně dereferencovat, Kotlin to ale z nějakého důvodu nechápe a vyžaduje před dereferencováním ještě assertion (!!)
Dík za odpověď. Tyhle "zkratky" taky nemusím. Nevidím moc důvod chovat se k jednomu parametru jinak než ke dvěma, resp. důvod chápu, ale ztráta konzistence a ortogonality mi za to nestojí. A ten multi-level return mi taky přijde jako slušný antipattern. Tyhle věci se naštěstí dají pořešit vnitřními pravidly ve firmě. Stejně (jakkoli se JVM nezabývám) bych ale asi pořád dal Kotlinu přednost před Javou.
Scala narazila na své limity z několika důvodů.
Zaprvé je ten jazyk velmi komplexní, je tam příliš mnoho fíčur. Kotlin na rozdíl od Scaly je ve stavu, kdy je silnější než Java, ale taky čitší a menší než Scala.
Druhý, možná ještě větší, problém je pomalost překladače. Jsou tam nějaké způsoby jak globálně měnit nebo přidávat metody k existujícím třídám, což dělá překlad komplikovaný a pomalý.