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
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
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