Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Milleks Scala?Programmeerimiskeeled 2017
Vesal Vojdani
Aktiivõppe
• Scala osa kohta on olemas suurepärased videoleongud.
• https://www.coursera.org/learn/progfun1/lecture/EQ7BX
• Ja sama materjali katab ka õpik.
• Siin loengus tuleb kaasa teha!
• Loengu fleepi link on nüüd abikeskuses!
Alustame ScalagaNew Project
Alustame ScalagaHetkel kasutage vana SBT versioon: 0.13.16
OLULINE! Probleem oli SBT 1.0.2
versiooniga, aga nüüd on ka olemas SBT 1.0.3, mis töötab
Java 9 puhul paremini.
See nüüd võtab aega!
Erinevad lähenemised ScalaleSiin jätkame FP paradigma propagandat: ideed on tähtsamad kui keel ise!
Gartner Hype CycleJava 8-st alates ei ole ka Scala ja Java erinevus enam nii suur
Image attribution: Jeremykemp at English Wikipedia
What’s the Big Idea?Working Hard to Keep it Simple
Mõtiskleme(moodle quiz!)
Kuidas harjutada süsteemi disain?
Kuidas harjutada süsteemi disain?
Kuidas harjutada süsteemi disain?
Interface Segregation: Exp on plussiga eraldatud Termide list.
Ta ei tea midagi madala taseme detailidest.
Kuidas harjutada süsteemi disain?
Interface Segregation: Exp on plussiga eraldatud Termide list.
Ta ei tea midagi madala taseme detailidest.
Single Responsibility Principle:Sulud käsitleme ühes kohas ja see funktsionaalsus on täiesti Factoris
“enkapsuleeritud”
Katsetage natuke Scala Sheetiga
• Proovige erinevat tüüpi avaldisidef x = …
• Ja siis funktsiooni definitsioonid:def square(x: Double): Double = x * x square(16)
• Proovige ka muuta definitsioonid üleval: kas väärtustub ümber?
Ja nüüd päris klass!(tegelikult objekt…)
Hello World!
object Hello { println("Hello, World!")
def main(args: Array[String]): Unit = { println("Good bye!") } }
Hello World!
object Hello { println("Hello, World!")
def main(args: Array[String]): Unit = { println("Good bye!") } }
Ühe ainsa isendiga klass (static meetodite asemel)
Hello World!
object Hello { println("Hello, World!")
def main(args: Array[String]): Unit = { println("Good bye!") } }
Ühe ainsa isendiga klass (static meetodite asemel)
Scala täidab objektide ja klasside kehasid
(konstruktorite asemel)
Hello World!
object Hello { println("Hello, World!")
def main(args: Array[String]): Unit = { println("Good bye!") } }
Ühe ainsa isendiga klass (static meetodite asemel)
Scala täidab objektide ja klasside kehasid
(konstruktorite asemel)
Seega ei olegi tingimata main meetodi sisse vaja midagi
kirjutada
Saab ka nii:
object Hello extends App { println("Hello, World!")
}
Nüüd Harjutused!
Definitsioonid
• Ennustage programmi käitumist!
• Kirjuta “def” asemel “val”.
• Kommenteeri välja println ja proovi mõlemad!
• Kui julged, proovi ka “lazy val”!
• Katseta kuni oled moodustanud hüpotees, kuidas nad käituvad.
object Hello extends App {
def x: Int = { println("Boo!") 21 }
println(x+x)
}
Nüüd saab tegutseda!
• Defineeri funktsioon, mis kontrollib kas etteantud sõne on pangram:ehk keele kõik tähed esinevad vähemalt ühe korra.
• Tuntud näide on “The quick brown fox jumps over the lazy dog”.
• Idee on nüüd siin ise katsetada: IDE autocomplete on suureks abiks!
• Kui oled oma lahenduse üle uhke, siis postita meie loengu fleep’i.
Väike modifikatsioon
• Muuda oma funktsioon, et see tuvastaks eestikeelsed pangramid.
• Microsoftis kasutatud näide on “See väike mölder jõuab rongile hüpata.”
• Vaatame siin põliseestlaste pangramid, kus ei ole c, ž, jne….(“Põdur Zagrebi tšellomängija-följetonist Ciqo külmetas kehvas garaažis”)
• Peamine küsimus on see: kui palju pidi eelmise versiooniga võrreldes muutma?
Täielik Hämming
• Kuna jäi natuke aega üle, võtsime ülesandeks arvutada Hammingi kaugus kahe (võrdse pikkusega) sõne vahel.
• Tuleb lihstalt loendada mitmes kohas sõned erinevad!(Wikipedias on näited…)
• Me (eriti Vesal) ei oska seda kahjuks veel lahendada :(
• Väikese fondiga on siin üks võimalik lahendus, aga sellest saame paremini aru, kui jõuame paaride ja case-avaldisteni.
def hamming(s1: String, s2: String) { (s1,s2).zipped.count({ case (x,y) => x != y }) }
Kogu Scala osa point: Muutmatute andmestruktuuridega
töötamine on puhas rõõm