Tiesa, teiginyje, kad „Scala yra sunku“, yra tiesos, tačiau mokymosi kreivė yra verta investicijų. Kai kurie sudėtingesni kalbos bruožai ( Tuples , Funkcijos , Makrokomandos , jei norite paminėti keletą), galų gale kūrėjui bus lengviau parašyti geresnį kodą ir padidinti našumą programuodami Skaloje. Atvirai kalbant, mes esame programuotojai, ir jei nesame pakankamai protingi, kad išmoktume kalbą, kuri turi tam tikrą sudėtingumą, tada esame netinkamo verslo.
Kopėčios yra saugi tipui JVM kalba, į objektyvų ir funkcinį programavimą įtraukianti į itin glaustą, logišką ir nepaprastai galingą kalbą. Kai kurie gali nustebti žinodami, kad „Scala“ nėra tokia nauja, kaip jie manė, pirmą kartą pristatyta 2003 m. Tačiau ypač per pastaruosius kelerius metus „Scala“ pradėjo kurti reikšmingą stebėtoją . Dėl ko kyla klausimas „Kodėl Scala?“.
Šiame straipsnyje nagrinėjami „Scala“ pranašumai, ypač palyginti su „Java“ (nes „Scala“ yra parašyta vykdyti JVM). „Scala“ nėra vienintelis bandymas sukurti „geresnę„ Java “. Tokios alternatyvos kaip Kotlinas ir Ceilonas taip pat nuėjo tuo keliu, tačiau jie priėmė esminį sprendimą likti labai arti pačios „Java“ kalbos sintaksės, kad sumažintų mokymosi kreivę. Tai gali atrodyti puiki idėja, bet galų gale ji šiek tiek nusižengia tuo, kad verčia jus likti tose pačiose „Java“ paradigmose, dėl kurių pirmiausia norėjosi sukurti „geresnę„ Java “.
Priešingai, „Scala“ buvo sukurta specialiai tam, kad būtų geresnė kalba , atskleidė tuos „Java“ aspektus, kuriuos ji laikė ribojančiais, pernelyg varginančiais ar varginančiais kūrėjo. Todėl iš tiesų yra kodų skirtumai ir paradigmos pokyčiai, kurie gali šiek tiek apsunkinti ankstyvą „Scala“ programavimo mokymąsi, tačiau rezultatas yra daug švaresnė ir gerai organizuota kalba, kurią galiausiai lengviau naudoti ir padidinti produktyvumą.
Nors „Java“ kalbos paprastumas buvo jos sėkmės dalis, ironiškai, ji taip pat prisidėjo prie jos sudėtingumo. Žinoma, „Java“ galite parašyti beveik bet ką, tačiau tam reikalingos kodo eilutės gali būti bauginančios. Kita vertus, „Scala“ programavimas yra šiek tiek sudėtingesnės struktūros. Bet jei galite parašyti šiek tiek sudėtingesnį viengungis kodo eilutė, pakeičianti 20 „paprastesnių“ „Java“ eilučių, kuri iš tikrųjų yra sudėtingesnė?
Tiesa ta, kad „Java“ yra tiesiog per daug kalbanti. Programoje „Scala“ kompiliatorius yra nepaprastai protingas, todėl kūrėjui nereikia aiškiai nurodyti tų dalykų, kuriuos kompiliatorius gali padaryti. Palyginkite, pavyzdžiui, šį paprastą „Hello World!“ programa „Java“ ir „Scala“:
Sveikas pasaulis „Java“:
public class HelloJava { public static void main(String[] args) { System.out.println('Hello World!'); } }
Sveikas pasaulis Scaloje:
object HelloScala { def main(args: Array[String]): Unit = { println('Hello World!') } }
Nors čia nėra didelio skirtumo tarp dviejų kalbų, „Scala“ net ir šiame paprastame pavyzdyje yra mažiau vertinga.
Norėdami gauti praktiškesnį pavyzdį, pažvelkime į paprasto styginių sąrašo sukūrimą:
„Java“:
List list = new ArrayList(); list.add('1'); list.add('2'); list.add('3');
Kopėčios:
val list = List('1', '2', '3')
Be abejo, „Java“ yra keletas gudrybių, kurios šiek tiek sutrumpina kodą, tačiau ne įprastai.
Dabar apsvarstykite atvejį, kai turime eilučių, kurios yra skaičiai, sąrašą, tačiau mes norime konvertuoti šį sąrašą į sveikųjų skaičių sąrašą:
„Java“:
List ints = new ArrayList(); for (String s : list) { ints.add(Integer.parseInt(s)); }
Kopėčios:
val ints = list.map(s => s.toInt)
Dėl „Scala“ funkcinių savybių ši konversija tampa itin paprasta.
Pažvelkime žingsniu toliau ir palyginkime standartinius pupelius / paprastas senas „Java“ objektas (POJO) kūrimas „Java“ ir „Scala“.
kaip kainuoti ipo
Pirma, „Java“ versija:
public class User { private String name; private List orders; public User() { orders = new ArrayList(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getOrders() { return orders; } public void setOrders(List orders) { this.orders = orders; } } public class Order { private int id; private List products; public Order() { products = new ArrayList(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public List getProducts() { return products; } public void setProducts(List products) { this.products = products; } } public class Product { private int id; private String category; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }
Phew. Lotta kodas.
Dabar „Scala“ versija:
class User { var name: String = _ var orders: List[Order] = Nil } class Order { var id: Int = _ var products: List[Product] = Nil } class Product { var id: Int = _ var category: String = _ }
Kuri kalba pasakėme, kad sudėtingesnė ?!
Jei tai padarėte iki šiol ir esate „Java“ programuotojas, galite galvoti, kad aš nesąžiningai palyginu kodą. Juk niekas netrukdo man viešai skelbti kintamuosius „Java“ ir tada atsikratyti getters ir seterių.
Vis dėlto, jei jūs pagalvotumėte apie „Java“ praktikų ir atsiskaitymų argumentus, tai yra skirta būtent ateičiai. Tai yra, jei vėliau reikės pridėti tam tikrą logiką prie kintamųjų gavimo ar nustatymo, turėtumėte iš naujo parašyti tuos viešuosius kintamuosius, kad vietoj jų būtų naudojami metodai (todėl „Java“ programoje raginama pradėti naudoti skaičiuoklius ir nustatytuvus) ). Tačiau programuojant „Scala“ taip nėra. Dėl kalbos dizaino abstrakcija lieka nepažeista, nereikalaujant getters ir seterių. Apsvarstykite, pavyzdžiui, šį modifikuotą User
klasė „Scaloje“, kuri meta NullPointerException
jei bandysite nustatyti vardą į nulį:
class User { private var _name: String = _ var orders: List[Order] = Nil def name = _name def name_=(name: String) = { if (name == null) { throw new NullPointerException('User.name cannot be null!') } _name = name }
Ir vis tiek galite nustatyti tokį pavadinimą:
user.name = 'John Doe'
Atkreipkite dėmesį, kad tai visiškai nereikalauja iš anksto sukonfigūruoti metodo prieigos priemonių.
Be to, kadangi „Scala“ teikia pirmenybę nekintamumui, tai „Scala“ galiu parašyti dar glaustiau su atvejų klasėmis:
case class User(name: String, orders: List[Order]) case class Order(id: Int, products: List[Product]) case class Product(id: Int, category: String)
Gana beprotiška, kiek mažiau kodo turiu parašyti.
Dabar apsvarstykite scenarijų su pirmiau paminėtomis klasėmis, kai noriu pridėti puikų metodą User
klasė, kuri pateikia visų Products
sąrašą kad User
įsakė:
Įprastame „Java“ pasaulyje:
public List getProducts() { List products = new ArrayList(); for (Order order : orders) { products.addAll(order.getProducts()); } return products; }
Laimei, java.util.List
turi addAll
metodas arba getProducts()
būtų buvę dar ilgiau „Java“.
Kita vertus, „Scaloje“ mums reikia tik:
def products = orders.flatMap(o => o.products)
Galite pamatyti, kiek mažesnis yra „Scala“ kalbos diegimas. Taip, „Scala“ naujokui tai gali atrodyti sudėtingiau, tačiau kai iš tikrųjų visiškai suprasite jo sąvokas, „Scala“ kodas atrodys kur kas paprastesnis nei „Java“ kodas.
Čia pasidarykime dar šiek tiek komplikuotiau. Ką daryti, jei norime gauti tik Products
per tam tikrą Category
?
Šiuo atveju negalime pasinaudoti addAll
pranašumais metodas java.util.List
, todėl viskas tampa bjauriau Java kalba :
public List getProductsByCategory(String category) { List products = new ArrayList(); for (Order order : orders) { for (Product product : order.getProducts()) { if (category.equals(product.getCategory())) { products.add(product); } } } return products; }
Skaloje , tačiau kodas išlieka gana paprastas. Mes tiesiog naudojame flatMap
sujungti kiekvienos Order
produktų sąrašus suplotas į vieną sąrašą, tada mes filtruojame įtraukdami tik tuos, kurie atitinka kategoriją:
def productsByCategory(category: String) = orders.flatMap(o => o.products).filter(p => p.category == category)
Per pastaruosius kelerius metus naujų kalbų tikrai netrūko, tačiau, nors beveik visos kitos neseniai atsiradusios kalbos yra dinamiškos, „Scala“ yra tipiškas.
Kaip profesionalus kūrėjas, nors aš žinau ir naudoju daug dinamiškų kalbų, manau, kad kompiliavimo laiko patikros yra nepaprastai svarbios norint parašyti tvirtą kodą. Dinamiškoje kalboje niekada negalėsite būti tikri, kad jūsų kodas yra pakankamai be klaidų ir tvirtas, kol iš tikrųjų nepaleisite jo pagal įvairius scenarijus. Tai gali sukelti potencialiai rimtų kodo defektų, kurie niekada nesuvokiami tol, kol kodas yra gaminamas.
Tikimės, kad šiame straipsnyje pakankamai daug „Java“ ir „Scala“, kad iš anksto suprastumėte „Scala“ galią ir galimybes ir sužadintumėte norą mokytis kalbos. Tai ne tik puiki kalba, dėl kurios programavimas gali būti mažiau varginantis ir malonesnis, bet ir buvimas naudoja vienos didžiausių kompanijų pasaulyje („LinkedIn“, „Twitter“, „FourSquare“, „The Guardian“, tik keli jų vardai).
„Scala“ populiarumas ir naudojimas sparčiai auga, ką įrodo vis didesnis atvirų pozicijų skaičius „Scala“ kūrėjai . Jei dar to nepadarėte, dabar būtų tinkamas metas pradėti važiuoti banga ir nebeklausti „Kodėl mokytis„ Scala “?“
$ klaida [] php
„Scala“ yra galinga aukšto lygio programavimo kalba, apimanti objektyvų ir funkcinį programavimą. Tai saugi tipui kalba, kuri remiasi JVM vykdymo laiku.
Daugybė dalykų, pradedant mašininiu mokymusi, baigiant žiniatinklio programomis. „Scala“, kaip aukšto lygio bendrosios kalbos kalba, gali pasigirti plačiu galimų programų spektru. „Scala“ leidžia kūrėjams gerai naudoti standartines JVM funkcijas ir „Java“ bibliotekas.
Jei svarstote pasinerti į „Scala“, akivaizdu, kad turėsite „Java“ išsilavinimą, ir jums nebus sunku rasti mokymosi išteklių internete. Tačiau jei neturite „Java“ patirties, turėsite išmokti pagrindų. Taip pat padės susipažinti su funkcinėmis programavimo kalbomis.
Remiantis žiniasklaidos pranešimais ir oficialiais pareiškimais, „Scala“ naudoja daugybė technologijų kompanijų, įskaitant „Netflix“, „Twitter“, „LinkedIn“, „AirBnB“, AT&T, „eBay“ ir net „Apple“. Jį taip pat naudoja finansai, tokie kaip „Bloomberg“ ir UBS.
Pastaraisiais metais „Scala“ prarado dalį savo patrauklumo, todėl kai kurie padarė išvadą, kad tai yra išeitis. Tai nėra mažų diskusijų objektas. Nors tiesa, kad kai kurios garsios kompanijos to atsisakė, „Scala“ vis dar stipriai veikia ir išlaiko daugybę pasekėjų.