Principles of programming in scala

of 24 /24
SCALA ZÁKLADY FUNKCIONÁLNÍHO PROGRAMOVÁNÍ Jakub Kohout, leden 2014 Hradec Králové 1

Embed Size (px)

Transcript of Principles of programming in scala

  • SCALAZKLADY FUNKCIONLNHO PROGRAMOVNJakub Kohout, leden 2014Hradec Krlov *

  • Zklady jazykaSyntaxeZkladn konstruktyKolekcePodpora distribuovanch aplikac a konkurennho programovn

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Zsady objektovho paradigmatu programovnAbstrakceZapouzdenDdinostPolymorfismusSOLID design principles*Single responsibility principleOpen closed principleLiskov substitution principleInterface segregation principleDependency injectionFavor composition over inheritanceDRY (dont repeat yourself)

    *http://javarevisited.blogspot.cz/2012/03/10-object-oriented-design-principles.html

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Zsady funkcionlnho paradigmatu programovnno method side effects metody by mly vdy vracet stejn vpoet pi stejnch vstupnch datech --> opan oproti imperativnmu styly programovnimmutable variablesnemnn promnn (list, set, map) Rekurze (tail recursion, accumulator), labda kalkulus =>metody jsou mn spletit, jsou vce znovupouiteln a spolehlivmetody by mly komunikovat s prostedm pouze skrze vstupn argumenty a nvratov hodnoty*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • scalable languageuren pro psan malch skript i rozshlch systm,b na standardn JVM, i nestandartn JVM (Dalvik)Scala kd je kompilovn do bytekdu kompiltor pro Scalu vytvoen tvrcem kompiltoru Javydoke vyuvat vechny existujc Java knihovny, podpora .NETv ppad absence IDE, je mon pout kompiltor SBT s interpretem pkaz REPLpropaguje kombinaci objektov orientovanho a funkcionlnho konceptu programovndky konstruktm funkcionlnho jazyka umouje pst snadno a velmi rychle jednoduch algoritmydky konstruktm OO jazyka umouje snadno vytvet rozshl systmyscala je ist objektov orientovan jazyk, ne jako Java*ve je objekt - i voln anonymn funkce

    * Scala neumouje vytvaet statick promnn a metody, nem primitivn typy*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • vkonnost kdu vtinou stejn jako Javascala vyuv hodn knihoven Javy, obohacuje jekonverze mezi datovmi typy, prce s kolekcemivyuv i primitivn typy Javy (o jejich pouit rozhoduje kompiltor)

    Scala is not just a nicer Java.je to bohat jazyk, odstrauje nadbyten kd - o polovinu krat programy

    Java zpisclass MyClass { private int index; private String name;

    public MyClass(int index, String name) { this.index = index; this.name = name; }}Scala zpisclass MyClass(index: Int, name: String){ }*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Prvky programovacho jazyka Scalasyntaxe z Java, C# *exekun model, class knihovny, zkladn datov typy z Javyuniform object model ze Smalltalku (pak Ruby)pstup k funkcionlnmu programovn je z SML, OCaml, F#funkce vyho du - Haskel, MLactor concurency library - Erlangdal Lisp, C++, Iswim, Algol, Simula, Betapln novinkytraits - umouje snadnou kompozici objektabstract types - vce OO alternativa ke generickm typmpattern matchingJazyky kter kombinuj funkcionln a objektov pstup k progamovnRuby, Python, Smalltalk

    *syntaxe Java a C# pevzata z C, C++*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • staticky typovan jazyk

    vhody odstrauje hodn kompilanch chyb (napklad zabrn pokusu nastavit do Int promnn teba Boolean hodnotu)lep dokumentace kdupohodlnj refaktoring - opravte jednu st kdu a okamit vidte, kter dal sti byly opravou zasaeny

    nevhodybn bvaj vce "ukecan"

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Promnnval - values (nemnn)var - variables (promnn) typ nen nutn vtinou deklarovat explicitn (odvozen)hodnota promnn je vyhodnocena okamitlazy val - hodnota promnn je vyhodnocena a pi prvnm pouitobsahuje pouze referenn datov typy, i kdy kompiltor nsledn pouv Java primitivn typy, tam kde je to mon kvli vkonnosti

    N-tice (Tuples)n-tice hodnot libovolnch datovch typvalpair = ("value",1022) val(label, number) = pair pair._1pair._2 pair.swap

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Metody s nvratovm typem (nemus bt vtinou explicitn uveden)deffunc(x: Int, y: Int):Int = x + yfunkce je vyhodnocena pi zavolnnvratov typ je nutn uvst pokud je funkce volna rekurzivnbez nvratovho typudeffunc(x: Int, y: Int) {}kd je vyhodnocen pi kadm volnanonymnfunkce, uloen do promnnvalf = (x: Int) => x +1kod je vyhodnocen pouze jednouf(4) > res4:Int= 5sten voln metodydeffunc(x: Int, y: Int, z: Int): Int = x + y + zvalf =func(2, _: Int, _: Int) *f(3,4) > res6: Int = 9

    *vytvo funkci! tj. Objekt pomoc metody apply, apply vol func pouze jednou*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Metody Funkce vyho du (higher order functions)jsou to metody, kter pebraj njakou funkci jako parametr, nebo vrac funkci jako nvratov typ

    defsuma(f: Int => Int): (Int, Int) => Int = { defsumf(a: Int, b: Int): Int = if(a < b) f(a) + sumf(a +1, b)elsef(b)sumf}*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Metody Curryingrozdlen vce vstupnch parametr do skupin za elem postupnho proveden funkcekonstrukt pat do takzvanch control abstractionsdefsuma(f: Int => Int)(a: Int, b: Int): Int = {if(a < b) f(a) + suma(f)(a +1, b)elsef(b)}val partialResult = suma(x => x * x * x)_val result = partialResult(1, 10)

    jin zpis a voln fcedefsuma(a: Int,b: Int)(f: Int => Int): Int = {if(a < b) f(a) + suma(a +1, b)(f)elsef(b)}suma(1,10) { x => x * x * x} *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Metody Promnn dlka argument metodydeftransform(f: Int => Int)(numbers: Int*) = { numbers.map(number => f(number))} transform(x => x*x)(1,2,3,4,5)

    voln funkce, kter nem parametry - me bt bez zvorek --> functionparametry metod jsou defaultnvalreturn nemus bt explicitn v metodch uvedeno, Scala vrac vsledek poslednho vpotu metodyje vhodn pst metody bez klovho slovareturn, podporuje to funkn dekompozici a vytven malch(pehlednjch) funkc

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Tdystejn jako v Javpromnn bez modifiktoru je defaultn public (private, protected mus bt uvedeno explicitn)classMyClass(c: String) { valcolor = c defprintColor() { println(color) } }valcla =newMyClass("cerna") cla.color cla.printColornemaj statick promnn a metodystatick promnn v Jav* jsou v rozporu se zsadami OOP - naruuje zapouzden

    *statick promnn jsou pouvny jako nhraka scoped promnnch(session), problmem je, e mohou bt zmnny, napklad, kdy v dan JVM b dv instance programu, kter m stejn statick promnn (tyto promnn jsou v JVM pouze jednou, sdleny obma programy)

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • TraitKolekce pol a chovn, kter mohou roziovat njakou tdutda me bt roziovna jednm, nebo vce traitypro rozen tdy o trait se pouv klov slovowithJednm ze zsad SOLID (interface segregation principle) je nsledujc:kdy tda implementuje interface, mla by implementovat vechny jeho metodystv se, e v aplikaci existuje nkolik implementac jednoho interface, ale ne kad tda potebuje implementovat vechny metody trait Car { val brand: String } trait Shiny { val shineRefraction: Int } class BMW extends Car with Shiny { val brand = "BMW" val shineRefraction = 12 }

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Objektyobjekt pedstavuje singletonvyuvny jako Factory se statickmi metodamiobjekt se me jmenovat stejn jako tda, pokud je takov definovn ve stejnm zdrojovm souboru jako dan tda, pak se nazv class companion objecttda a jej companion objekt mohou sdlet sv privtn promnnnemohou pebrat parametry v konstruktoru, protoe nemohou bt instanciovnyjsou inicializovny pi prvnm pstupu k nim*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Pattern matchingpouvno pro dekompozici datovch strukturnahrazuje nap. pouit instanceOf nebo switch - case , nebo if-elsestatementuvalvalue ="1"val result = valuematch{case"1"=> "one"case"2"=> "two" case_ => "nothing" }

    Pattern match lze provdt i na rovni tdje poteba definovat takzvan case classesabstract classExprcase classVar(name:String)extendsExprcase classNumber(num:Double)extendsExprcase classUnOp(operator:String, arg:Expr)extendsExpr

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • fornejedn se o klasick cyklus, ale o kombinaci jin konstruktme bt pln nahrazen kontrukty: map, flatMap, filterklasick:for(i
  • Kolekce (immutable)ListStreamPodobn jako list, vdy je vyhodnocena jen hlava, tlo je vyhodnoceno a na podnVectorRangeSeazen rovnomrn rozdlen sekvence selStringJako v Jav, implicitn je konvertovn na Seq[Char]MapSetBez duplicit*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Kolekce (immutable)xs exists p // true if there is at least one element for which predicate p is truexs forall p // true if p(x) is true for all elements xs zip ys // returns a list of pairs which groups elements with same index together xs unzip // opposite of zip: returns a pair of two lists xs.flatMap f // applies the function to all elements and concatenates the result xs.sum // sum of elements of the numeric collection xs.product // product of elements of the numeric collection xs.max // maximum of collection xs.min // minimum of collection xs.flatten // flattens a collection of collection into a single-level collection xs groupBy f // returns a map which points to a list of elements xs distinct // sequence of distinct entries (removes duplicates)*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Podpora reaktivnho programovnRx libraryTry[T] oeten chybFuture[T] asynchronn zpracovn, oeten chybObservable[T] asynchronn zpracovn streamuScheduler proveden bloku kdu v nov vlkn

    Aktiakka libraryPro vvoj systm postavench na zklad lidsk interakceAkti jsou nezvisl entity, kter si mezi sebou zaslaj zprvy*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Akti

    object BankAccount { case class Deposit(amount: BigInt) { require(amount > 0) } case class Withdraw(amount: BigInt) { require(amount > 0) } case object Done case object Failed }

    class BankAccount extends Actor { import BankAccount._ var valance = BigInt(0) def receive = { case Deposit(amount) => balance += amount sender ! Done case Withdraw(amount) if amount balance -= amount sender ! Done case _ => sender ! Failed } }*SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • ShrnutVhody Jazyk umoujc jak funkcionln tak objektov styl programovnRoiitelnBohat jazyk, vce konstruktPodpora asynchronnho zpracovnPodpora distribuovanho zpracovn akka Kd je krat a pehlednjVkonnost piblin stejn jako Java

    NevhodyBlc se Java 8 ? *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

  • Zdrojehttp://twitter.github.io/scala_school/http://docs.scala-lang.org/tutorials/tour/tour-of-scala.htmlhttp://www.tutorialspoint.com/scala/Online kurzyhttps://www.coursera.org/course/progfunhttps://www.coursera.org/course/reactive

    *SCALA - ZKLADY FUNKCIONLNHO PROGRAMOVN

    *SCALA - zklady funkcionlnho programovn