Scala
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
502
On Slideshare
502
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. SCALA   Popularna  alternatywa  dla  języka  Java   Dlaczego  warto  spróbować?  
  • 2. Scala  –  Co  to  jest?   Java          à  zbyt  toporna   Języki  funkcyjne    à  zbyt  odmienne   Zrównoleglenie    à  trudne,  błędogenne     Nowa  moda  na  programowanie  funkcyjne  w  JVM  
  • 3. Kto  wykorzystuje  język  Scala?  
  • 4. Popularność  Scali   hLp://www.itjobswatch.co.uk/  
  • 5. Popularność  Scali   RedMonk   GitHub  projects   Stack  Overflow  
  • 6. Popularność  Scali   Alexa  
  • 7. Nowe  podejście  
  • 8. Wydajność  programów   hLp://benchmarksgame.alioth.debian.org/   Wiele  nowych  obiektów  VS  zrównoleglenie   Inteligentniejszy  kompilator  à  szybsze  działanie          
  • 9. Wydajność  deweloperów   Programy  napisane  w  Scali  są:     BARDZIEJ  ZWIĘZŁE     CZYTELNIEJSZE     ZAWIERAJĄCE  MNIEJ  BŁĘDÓW     DAJĄ  WIĘCEJ  RADOŚCI  DEWELOPEROM  
  • 10. Przykład  1   ["Adam Nowak", "Marcin Kowalski", "Daniel Kowalski", "Damian Nowak", "Alicja Nowak”]       ! {Kowalski=[Marcin Kowalski, Daniel Kowalski], ! Nowak=[Adam Nowak, Damian Nowak, Alicja Nowak]}!
  • 11. Przykład  1  -­‐  Java   String [] people = {"Adam Nowak", "Marcin Kowalski", "Daniel ! ! !Kowalski", "Damian Nowak", "Alicja Nowak"};! ! Map<String, List<String>> namesByLastName = ! ! !new TreeMap<String, List<String>>();! for (String name : people) {! String[] splitName = name.split(" ");! List<String> mappedNames = namesByLastName! .get(splitName[1]);! if (mappedNames == null) {! mappedNames = new ArrayList<String>();! namesByLastName.put(splitName[1], mappedNames);! }! mappedNames.add(name);! }! ! System.out.println(namesByLastName);!
  • 12. Przykład  1  -­‐  Scala   val people = List("Adam Nowak", "Marcin Kowalski", ! ! !"Daniel Kowalski", "Damian Nowak", "Alicja Nowak")! ! println(people.map(_.split(' '))! ! !.map(arr => (arr(0), arr(1)))! ! !.groupBy(_._2).toSeq.sortBy(_._1))!
  • 13. Przykład  2  -­‐  Java   Problem  z  logowaniem  zdarzeń     Czy  to  nie  komplikuje  kodu?     public class JavaTest {! public static final Logger logger = ! LogFactory.getLog(JavaTest.class);! ! public static void main(String[] args) {! List veryLargeCollection = new List();! if (logger.isDebugEnabled()) {! logger.debug(veryLargeCollection);! }! }! }!
  • 14. Przykład  2  -­‐  Scala   trait Loggable { self =>! val logger = LogFactory.getLog(self.getClass)! ! def debug[T](msg: => T): Unit = {! if (logger.isDebugEnabled) logger.debug(msg)! }! }! ! object Test extends Loggable {! def main(args: Array[String]) {! val veryLargeCollection = List()! debug(veryLargeCollection)! }! }!
  • 15. Przykład  3  -­‐  Java   Niejawna  konwersja  może  zwiększyć  czytelność     public class Complex {! public final double re, im;! ! public Complex(double re, double im) { … }! public Complex add(Complex complex) { … }! }! ! String someString = "5";! Integer someNumber = 4;! Complex z = new Complex(4, 7)! .add(new Complex(someNumber, 0))! .add(new Complex(Double.parseDouble(someString), 0));! ! !  
  • 16. Przykład  3  -­‐  Scala   case class Complex(re: Double, im: Double) {! def +(complex: Complex): Complex = ! Complex(re + complex.re, im + complex.im)! }! ! implicit def stringToComplex(str: String): Complex = ! Complex(str.toInt, 0)! implicit def intToComplex(num: Int): Complex = ! Complex(num, 0)! ! val z = Complex(3, 4) + 4 + "5"! !
  • 17. Przykład  4  –  DSL  i  XML   Scala  pozwala  na  tworzenie  własnych  języków     val loan = 100000 loan! val simulation = loan duration (120 months) ! rates (5.5 %) simulate payments.equal   ! I  zagnieżdżanie  XML   ! val table = <table class="my-table">! { users map { user => ! <tr>! <td>{user.fname}</td> ! <td>{user.lname}</td>! </tr>! }}! </table>!
  • 18. Przykład  5  –  PaLern  Matching   case class Group(name: String, category: String)! case class User(fname: String, lname: String, ! group: Group)! ! val userExtractor = ! """User('(w+)','(w+)',Group('students','(w+)'))""".r! ! x match {! case userExtractor(fname, lname, _) => ! (fname, lname)! case User(fname, lname, Group("students", _)) => ! (fname, lname)! case _ => null! }!
  • 19. Przykład  6  –  System  Aktorów   Programowanie  aplikacji  działających  asynchronicznie   ! class MyActor extends Actor {! def receive = {! case „ping” => sender ! „pong”! case Echo(msg) => sender ! msg! case cmd: Command => cmd()! case STOP => this ! PoisonPill! }! }!
  • 20. Oczekiwania  biznesowe   •  Szybkość  tworzenia  rozwiązań   •  Łatwość  utrzymania  i  rozwoju   •  Stabilność  i  niezawodność   •  Wysycenie  technologią  (frameworki,   biblioteki,  infrastruktura)     •  Dostęp  do  specjalistów  
  • 21. Trendy   •  Obliczenia  rozproszone  (chmura  obliczeniowa)   •  Heterogeniczne  źródła  danych  i  przetwarzanie   asynchroniczne  (Akka)   •  Jeden  system,  różne  kanały  dostępu   •  Odseparowanie  warstwy  logiki  do  warstwy   prezentacji   –  JavaScript   –  HTML5   –  REST   –  AngularJS  
  • 22. Eneterprise  czy  Startup?   Java/J2EE   Python,  Ruby,  PHP…   •  Bogaty  ekosystem   •  Ugruntowania  pozycja  w  biznesie   •  Stabilność   •  Skalowalność   •  Wydajność     Rozwiązania  Enterprise   •  Szybkość  tworzenia  aplikacji   •  Niska  bariera  wejścia   •  Niskie  koszty   •  Duża  elastyczność   •  Łatwość  tworzenia  interfejsów   webowych     Małe  rozwiązania/Startupy   +  Frameworks  
  • 23. •  Lazy  Loading   •  Parallel  Rendering   •  AJAX  &  Comet  (dla  HTML  i  danych)   •  Wiring   •  Designer  Friendly  Templates  (model  View   First)   •  Security  
  • 24. •  Wsparcie  dla  Java  i  Scala   •  Bezstanowa  warstwa  webowa  (brak  sesji)   •  MVC   •  Duża  skalowalność  (Akka,  Non-­‐blocking  I/O)   •  Odejście  od  tradycyjnego  modelu  J2EE  
  • 25. Vs.   LiG   Play   J2EE   Non  J2EE   RESTLess/RESTful   RESTLess   View  First   MVC   Kontener  serwletów   NeLy  I/O,  Akka   Liu  Actors,  Akka   Akka   Elastyczne  podejście:   •  Klasyczna  aplikacja  J2EE   •  Serwowanie  danych     Nacisk  na:   •  Skalowalność   •  Przetwarzanie  rozproszone   •  Cienkiego  klienta   •  Aktywne  forum     •  Rozproszona  dokumentacja   •  Słaby  PR   •  Aktywne  forum  i  StackOverflow   •  Dobra  dokumentacja   •  Dobra  prasa  
  • 26. Kto  używa?