Оптимизација прихода од малопродаје помоћу предвиђања продаје АИ
Наука О Подацима И Базе Података
Постоји истина у тврдњи да је „Сцала тешка“, али крива учења вреди уложити. Неке сложеније особине језика ( Туплес , Функције , Макрои , да набројимо неколико) на крају олакшавају програмеру писање бољег кода и повећати перформансе програмирањем у Скали. Искрено, програмери смо и ако нисмо довољно паметни да научимо језик који има неку сложеност, онда погрешно послујемо.
Мердевине је ЈВМ језик безбедан за тип који укључује и објектно оријентисано и функционално програмирање у изузетно концизан, логичан и изузетно моћан језик. Неки ће се можда изненадити када сазнају да Сцала није толико нова као што су мислили, јер је први пут представљена 2003. године. Међутим, посебно у последњих неколико година Сцала је почела да развија значајне следбенике . Што поставља питање „Зашто Сцала?“.
Овај чланак испитује предности Сцале, посебно у односу на Јаву (јер је Сцала написана да ради у ЈВМ-у). Сцала није једини покушај стварања „боље Јава“. Алтернативе као што су Котлин и Цеилон су такође ишли тим путем, али донели су основну одлуку да остану врло блиски у синтакси са самим језиком Јава, како би минимализовали криву учења. Ово се може чинити сјајном идејом, али на крају је помало самопоражавајуће јер вас приморава да останете у оквиру низа оних истих Јава парадигми које су и биле разлог за жељу да се створи „боља Јава“.
Супротно томе, Сцала је створена посебно са циљем да буде боља Језик , избацујући оне аспекте Јаве које је сматрао рестриктивним, претерано заморним или фрустрирајућим за програмера. Као резултат, заиста постоје разлике у коду и промене парадигми које могу мало отежати рано учење Сцала програмирања, али резултат је много чишћи и добро организован језик који је на крају лакши за употребу и повећава продуктивност.
Иако је једноставност језика Јава део његовог успеха, иронично је и то што је допринело његовој сложености. Свакако, на Јави можете писати скоро све, али редови кода потребни за то могу бити застрашујући. С друге стране, програмирање у Сцали има мало сложенију структуру. Али ако можете да напишете мало сложенији једно линија кода која замењује 20 „једноставнијих“ линија Јаве, која је заиста сложенија?
Истина је да је Јава често превише детаљна. У Сцали је компајлер невероватно паметан, па се тиме избегава да програмер мора експлицитно да наведе оне ствари за које компајлер може да закључи. Упоредите, на пример, ово једноставно „Здраво, свет!“ програм на Јави против Сцале:
Здраво, свет у Јави:
public class HelloJava { public static void main(String[] args) { System.out.println('Hello World!'); } }
Поздрав свету у Скали:
object HelloScala { def main(args: Array[String]): Unit = { println('Hello World!') } }
Иако овде нема велике разлике између ова два језика, Сцала је мање детаљна чак и у овом једноставном примеру.
За практичнији пример, погледајмо стварање једноставне листе жица:
Јава:
List list = new ArrayList(); list.add('1'); list.add('2'); list.add('3');
Лествица:
val list = List('1', '2', '3')
Свакако у Јави постоје неки трикови да се код мало скрати, али не у уобичајеној употреби.
Сада размотримо случај када имамо листу низова који су бројеви, али желимо да ту листу претворимо у листу целих бројева:
Јава:
List ints = new ArrayList(); for (String s : list) { ints.add(Integer.parseInt(s)); }
Лествица:
val ints = list.map(s => s.toInt)
Захваљујући Сцала-иним функционалним својствима, ова конверзија постаје изузетно једноставна.
Идемо ствари корак даље и упоредимо стандардни пасуљ / обичан стари Јава објекат (ПОЈО) стварање у Јави и Скали.
научи Ц++\
Прво, Јава верзија:
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; } }
Фуј. Лотта код.
Сада верзија Сцале:
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 = _ }
За који језик смо рекли да је сложенији ?!
Ако сте до сада стигли и програмирате Јава, у овом тренутку можда мислите да вршим неправедно поређење кода. На крају, ништа ме не спречава да направим јавне променљиве у Јави, а затим да се отарасим гетера и постављача.
Међутим, ако се вратите резоновању иза гетера и постављача у Јави, то је посебно за проверу будућности. Односно, ако касније требате да додате логику било добијању или подешавању променљивих, морали бисте да препишете те јавне променљиве да бисте уместо тога користили методе (због чега се у Јава-у подстиче употреба гетера и постављача) ). Међутим, у програмирању Сцала то није случај. Због језичког дизајна, апстракција остаје нетакнута без потребе за гетерима и постављачима. Размотрите, на пример, ово измењено User
класа у Сцали која баца NullPointerException
ако покушате да подесите име на нулл:
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 }
А име и даље можете поставити овако:
user.name = 'John Doe'
Имајте на уму да ово у потпуности уклања потребу за унапред конфигурисањем приступника методама.
Штавише, с обзиром да Сцала преферира непроменљивост, ово могу да напишем у Сцали још сажетије са класама класа:
case class User(name: String, orders: List[Order]) case class Order(id: Int, products: List[Product]) case class Product(id: Int, category: String)
Прилично лудо колико мање кода морам да напишем.
Сада размотрите сценарио са горе наведеним класама где желим да додам изврстан мали метод у User
класа која враћа листу свих Products
да је User
је наредио:
У опширном свету Јаве:
да ли Ц++ има сакупљање смећа
public List getProducts() { List products = new ArrayList(); for (Order order : orders) { products.addAll(order.getProducts()); } return products; }
Срећом, java.util.List
има addAll
метода, или getProducts()
било би још дуже на Јави.
С друге стране, у Сцали нам је потребно само:
def products = orders.flatMap(o => o.products)
Можете видети колико је мања примена језика Сцала. Да, може изгледати сложеније за Сцала почетника, али када у потпуности разумете концепте који стоје иза њега, Сцала код ће изгледати много једноставније од Јава кода.
Хајде да се овде мало закомплицирамо. Шта ако желимо добити само Products
у оквиру одређеног Category
?
У овом случају нисмо у могућности да искористимо предност addAll
метода у java.util.List
, тако да ствари постају ружније на Јави :
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; }
У Скали међутим, код остаје прилично једноставан. Једноставно користимо flatMap
да комбинују листе производа са сваког Order
изравнати у једну листу, а затим филтрирамо да бисмо укључили само оне који се подударају са категоријом:
def productsByCategory(category: String) = orders.flatMap(o => o.products).filter(p => p.category == category)
У последњих неколико година сигурно није недостајало нових језика, али док су готово сви остали који су се недавно појавили динамични, Сцала је статички откуцана.
Као професионални програмер - иако знам и користим многе динамичке језике - моје је мишљење да су провере времена компајлирања невероватно важне за писање солидног кода. У динамичном језику никада не можете бити сигурни да је ваш код без грешака и робустан док га заправо не покренете у широком спектру сценарија. То може довести до потенцијално озбиљних недостатака у коду који се никада неће реализовати док се код не произведе.
Надамо се да овај чланак ставља Јава насупрот Сцале довољно да вам пружи прелиминарни осећај снаге и могућности Сцале и подстакне апетит за учењем језика. Не само да је то сјајан језик који програмирање може учинити мање досадним и угоднијим, већ и постојањем које користе неке од највећих компанија на свету (ЛинкедИн, Твиттер, ФоурСкуаре, Тхе Гуардиан, да набројимо само неке).
Популарност и употреба Сцале брзо расте, о чему сведочи и све већи број отворених позиција за Програмери Сцале . Ако то већ нисте учинили, сада би било право време да започнете јахање таласа и престанете да питате „Зашто учити Сцала?“
Сцала је моћан програмски језик на високом нивоу који укључује објектно оријентисано и функционално програмирање. То је језик сигуран за тип који се ослања на ЈВМ време извршавања.
Много ствари, од машинског учења до веб апликација. Као језик опште намене високог нивоа, Сцала се може похвалити широким спектром могућих примена. Сцала омогућава програмерима да добро користе стандардне ЈВМ функције и Јава библиотеке.
Ако размишљате о роњењу на Скали, очигледно ће вам бити од помоћи Јава и нећете имати проблема са проналажењем ресурса за учење на мрежи. Међутим, ако немате Јава искуства, мораћете да научите основе. Помоћи ће и познавање функционалних програмских језика.
Према извештајима медија и званичним изјавама, Сцалу користе бројне технолошке компаније, укључујући Нетфлик, Твиттер, ЛинкедИн, АирБнБ, АТ&Т, еБаи, па чак и Аппле. Такође се користи у финансијама, попут Блоомберга и УБС-а.
Последњих година Сцала је изгубила део своје привлачности, што је неке навело на закључак да је на одласку. О овоме нема велике расправе. Иако је истина да су је неке истакнуте компаније напустиле, Сцала је и даље јака и задржава велики број следбеника.