Friday, April 11, 2014

Warsztaty ze SCALĄ oraz frameworkiem PLAY


We wtorek 8 kwietnia dzięki inicjatywie Pawła Włodarskiego z firmy TomTom odbyły się warsztaty z programowania w języku Scala oraz tworzenie aplikacji przy użyciu frameworku Play.

Pierwsze zetknięcie ze Scalą może być nieco dziwne, jednak po paru minutach prowadzący rozwiał wiele wątpliwości odnośnie składni Scali. Od razu co rzuca się w oczy, to definicje podobne do tych używanych w innych językach programowania np JavaScript typu:
  • var

  • val

  • def

  • var - deklaracja zmiennej, która może być zmodyfikowana.
    val - deklaracja zmiennej, która nie może być zmodyfikowana (coś jak deklaracja zmiennej jako final w Javie)
    def - deklaracja metody / funkcji - tak jak void w Javie.

    Scala wykorzystuje programowanie funkcyjne oraz lambdy, coś co dopiero pojawia się w Java 8. Składnia Scali nie wydaje się być jakoś bardzo dziwna czy skomplikowana np:
     package poligon  
     object warsztaty {  
      println("Welcome to the Scala worksheet")    //> Welcome to the Scala worksheet  
      val list = List(1, 2, 3, 4, 5)         //> list : List[Int] = List(1, 2, 3, 4, 5)  
      def dodajJeden(arg: Int) = arg + 1       //> dodajJeden: (arg: Int)Int  
      list.map(arg=>arg+1).filter(arg=>arg>3)     //> res0: List[Int] = List(4, 5, 6)  
     }  
    

    W tym kawałku kodu powyżej deklarujemy sobie listę Integerów bez jawnej deklaracji typu. JVM w locie wychwytuje, że chodzi o typ Integer.
    Dodatkowo Paweł podkreślał, że możemy tutaj wykorzystać dowolną kolekcję z Javy - czyli robi się ciekawie.
    def - to tak jak opisałem deklaracja metody, która przyjmuje argument typu Integer i zwiększa go o 1.
    Piękną sprawą jest natomiast ostatnia linijka kodu, gdzie w 1 linii deklarujemy za pomocą lambda expressions wynik i przekazujemy rezultat jednej metody do drugiej. Efektu WOOOOW.... jeszcze nie ma, ale niektórym już się spodobał bardzo krótki zapis powodujący szybką iterację i filtrację według danych parametrów.

    Ciekawą sprawą jest to, że kompilator szybko kompiluje całość i pokazuje nam wynik poszczególnych działań.

    To jeszcze nie wszystko.


    Bardzo ciekawym rozwiązaniem w Scali są placeholdery na zmienne / funkcje. Wygląda to dość dziwnie na pierwszy rzut oka, jednak od razu widać było użyteczność tego podejścia.

    UWAGA EGZAMPYL

     package poligon  
     object warsztaty2 {  
      val list = List(1, 2, 3, 4, 5)           
      def dodajJeden(arg: Int) = arg + 1         
      val dodajJedenFunc: (Int => Int) = (arg: Int) => arg + 1                        
      val list2 = list.map(_ + 1).filter(_ > 3)      
      list2.reduce(_ + _)     
      }  
    

    Powyższy przykład robi prawie to samo co 1 kawałek kodu - śmieszy natomiast dziwny zapis "reduce(_ + _) "
    (Wynik --> 15, czemu sprawdźcie, bo kim jesteś? - Jesteś zwycięzcą)
    Te magiczne dolne podkreślniki to właśnie placeholdery. Powoli moja twarz robiła efekt WOW - jak to Paweł określił tutaj pojawia się efekt .... *pierdyknięcia. Chociaż nie każdy chciał dać po sobie znać, że ten efekt odczuł.

    W międzyczasie przyjechał catering i najsłynniejszy "włoski placek" przysłużył się w akcji dokarmiania programistów.

    Paweł pokazywał nam kolejne ciekawe sztuczki związane ze Scalą, funkcja która działa na placeholderze, który może być funkcją lub liczbą, a w ciele metody wykonuje kokatenację wyników zwracanych przez funkcję X.

    Tutaj już było bardzo duże woow.
     val wypisz = (str: String) => str + " aaa"     
      wypisz("bbb")                   
      def wypiszDwaRazy(arg: String)(fun: String => String) = {  
       fun(arg) + fun(arg)  
      }                          
      val wersjaShardkodowana = wypiszDwaRazy("ccc")_   
      wersjaShardkodowana { wypisz }           
      wersjaShardkodowana { arg => arg + "aaa" }   
    
    Co będzie rezultatem tego kawałka kodu? - Polecam samemu sprawdzić.

    PLAY - 7 na 10 osób przeszło ze Struts2 na PLAY

    Po kolejnej przerwie na regenerację sił i II fazie dokarmiania programistów nadszedł czas na prezentację frameworka PLAY.
    Paweł w ciągu dosłownie 1 minuty 3 komendami w commandline zbudował szkielet aplikacji.
    komendy:

    play new NAZWA_APKI - viola! mamy naszą aplikację gotową (szkielet)
    cd NAZWA_APKI a potem eclipse - mamy szkielet aplikacji gotowy do zaimportowania do Eclipse.
    Oczywiście w tle gdzieś tam działa Maven lub mavenopodobny tool który to builduje, ale.......
    Po zaimportowaniu apki do Eclipse'a mamy gotową do użycia aplikację w PLAY framework z testami!!

    Paweł pokazał nam w PLAY jak bardzo łatwo zbudować mappingi do odpowiednich kontorllerów, kilka linijek kodu, odpowiedni wpis w pliku routes + typ wywołania GET/POST i mamy gotowe, albo dynamiczne wiązanie już użytych odnośników typu href z akcjami. Jeżeli coś będzie nie grało, kompilator po kilku sekundach od razu nam wywali czerwony stacktrace.
    Nie warto rozpisywać i opisywać każdego przykładu z warsztatów - to trzeba zobaczyć!
    Oczywiście dość często uczestnicy zadawali pytania i często wywiązywała się dyskusja podczas warsztatów.
    Jak dla mnie - osoby która miała 1 raz styczność ze Scalą i Play - efekt wow był podczas demonstracji zastosowania placeholderów.
    Natomiast konkretne pier.... znaczy się - piorunujące wrażenie wywarł na mnie PLAY, gdyż kilkoma komendami tworzymy kompletną apkę wraz z testami, osoby które pisały kiedyś testy do apki MVC (np Spring MVC) bardzo docenią to ułatwienie.

    Podsumowując 1 warsztaty ze Scali i frameworka Play - były bardzo ciekawe. Scala/Play z pewnością będzie jeszcze bardziej zyskiwać na popularności, gdyż wykorzystujemy zalety języka funkcyjnego, lambda expressions i inne. Wszystkiego za jednym zamachem nie da się pokazać, dlatego bardzo gorąco zachęcam do udziału w kolejnych warsztatach (meetup, limit miejsc)

    Bardzo dziękujemy Pawłowi Włodarskiemu za inicjatywę oraz firmie TomTom za organizację warsztatów.





    2 comments: