Зачем нужна Scala?

40
Зачем нужна Scala? Александр Казачёнок

description

Презентация Александра Казачёнка на встрече Software Craftsmanship Belarus #9

Transcript of Зачем нужна Scala?

Page 1: Зачем нужна Scala?

Зачем нужна Scala?

Александр Казачёнок

Page 2: Зачем нужна Scala?

Scala в двух словах

• Краткость кода как в Ruby

• Возможности IDE как в Java

Page 3: Зачем нужна Scala?

Ruby или Java?

• Rubyменьше кода

• Javaумный компилятор

• Scalaменьше кодаумный компилятор

=> меньше багов

=> меньше багов

=> меньше багов=> меньше багов

Page 4: Зачем нужна Scala?

Erlang или Java?

• Java быстрее.JVM быстрее Erlang VM.

• Erlang быстрее.Проще создавать мастштабируемые прил.

• Scala быстрее.JVM быстрее Erlang VM.Проще создавать мастштабируемые прил.

Page 5: Зачем нужна Scala?

Мартин Одерски

• Придумал Scala• Написал компилятор Scala• Написал компилятор Java• Соавтор Java generics

• Смешанные Scala+Java проекты в Eclipse, etc• Microsoft спонсирует Scala.NET• Компиляция в JavaScript с Google Web Toolkit

Page 6: Зачем нужна Scala?

Джеймс Гослинг (создатель Java)

Page 7: Зачем нужна Scala?

Джеймс Страчан (создатель Groovy)

Page 8: Зачем нужна Scala?

Алекс Пейн (Twitter API Lead)

Page 9: Зачем нужна Scala?

Scala в работе

Page 10: Зачем нужна Scala?

Элитарность Scala

InfoQ: Тяжело ли найти разработчиков на Scala?Дэвид Поллак:

Нет. Найти хороших Scala разработчиков легко.

Я могу организовать отличную команду из 10 человек, готовую к работе на следующей неделе.

Они не будут дешёвыми (средняя цена $250/час плюс то, что возьму я). Они не будут локальными. Но они будут отличными.

Тяжело найти аутсорсовую команду из 25 Scala разработчиков за $40/час.

Page 11: Зачем нужна Scala?

Количество фич в Scala

• Намного меньше, чем в C++ или C# • Сравнимо с Java. Из Java удалены:

static членыпримитивные типыbreak и continueособое понятие об интерфейсахwildcard’ыraw типыenum’ы

• Фичи Scala более унифицированные и гибкие

Page 12: Зачем нужна Scala?

Пример кода на Javapublic class Person implements Serializable { private final String firstName; private final String lastName;  public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }  public String getFirstName() { return firstName; }  public String getLastName() { return lastName; } 

Page 13: Зачем нужна Scala?

Пример кода на Java (продолжение)public Person withFirstName(String firstName) { return new Person(firstName, lastName);} public Person withLastName(String lastName) { return new Person(firstName, lastName);}

public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Person person = (Person) o; if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) { return false; }

Page 14: Зачем нужна Scala?

Пример кода на Java (продолжение) if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) { return false; } return true; }

public int hashCode() { int result = firstName != null ? firstName.hashCode() : 0; result = 31 * result + (lastName != null ? lastName.hashCode() : 0); return result; }

public String toString() { return "Person(" + firstName + "," + lastName + ")"; }}

Page 15: Зачем нужна Scala?

То же самое на Scala

case class Person(firstName: String, lastName: String)  

Page 16: Зачем нужна Scala?

Использование

• Java

• Scala

Person mr = new Person("Bob", "Dobbelina");Person miss = new Person("Roberta", "MacSweeney");Person mrs = miss.withLastName(mr.getLastName());

val mr = Person("Bob", "Dobbelina")val miss = Person("Roberta", "MacSweeney")val mrs = miss copy (lastName = mr.lastName)

val mrs = miss.copy(lastName = mr.lastName)

val mrs = miss.copy(miss.firstName, mr.lastName)

Page 17: Зачем нужна Scala?

Коллекции

case class User(id: Int, userName: String)

val users: List[User] = // ....

val resultUsers = new ArrayBuffer[User]

for (i <- 0 until users.size) { if (users(i).userName != "test") { resultUsers += users(i) }}

Page 18: Зачем нужна Scala?

Коллекцииdef formatUsers(users: List[User]): String = {

val result = new StringBuilder

for (i <- 0 until users.size) {

val userName = users(i).userName

if (userName != "test") {

result.append(userName)

if (i < users.size - 1) {

result.append(", “)

}

}

}

return result.toString

}

Page 19: Зачем нужна Scala?

БАГ!

На предыдущем слайде есть баг :-(

Page 20: Зачем нужна Scala?

filter

val resultUsers = users.filter(user => user.userName != "test")

val resultUsers = users filter (_.userName != "test")

val resultUsers = users filter (user => user.userName != "test")

Page 21: Зачем нужна Scala?

map

val userNames = users map (_.userName)

val userNames = users.map(user => user.userName)

val userNames = users map (user => user.userName)

Page 22: Зачем нужна Scala?

mkString

userNames.mkString(", “)

users map (_.userName) mkString ", "

Page 23: Зачем нужна Scala?

formatUsers версия 2.0

• Нет бага :-)• Всего 3 шага• Каждый шаг имеет смысл сам по себе• Больше повторного использования кода

def formatUsers(users: List[User]) = users map (_.userName) filter (_ != "test") mkString ", "

Page 24: Зачем нужна Scala?

Повторное использование

• formatUsers версия 3.0

• …ScalaCL => граф.карта => быстрее в 10-100 раз

def formatUsersInParallel(users: List[User]) = formatUsers(users.par)

Page 25: Зачем нужна Scala?

public String formatUsers(final List<User> users) { final Collection<String> filteredUserNames = FluentIterable .from(users) .transform(new Function<User, String>() { @Override public String apply(final User user) { return user.getUserName(); } }) .filter(new Predicate<String>() { @Override public boolean apply(final String userName) { return !userName.equals("test"); } }) .toImmutableList(); return Joiner.on(", ").join(filteredUserNames); }

Java + Google Collections

Page 26: Зачем нужна Scala?

Паттерны проектирования банды 4-х

• Написание повторно используемого кода на Java требует больших усилий

• На динамических языках и Scala многие из этих паттернов тривиальны

• Критика паттернов Питером Норвигом (директор по исследованиям в Google Inc.)

• ОО тоже когда-то было паттерном

Page 27: Зачем нужна Scala?

Singleton

object Registry { def getEntry(): Entry = { // … } // …}

val entry = Registry.getEntry  

Page 28: Зачем нужна Scala?

Strategy

def calculateTax(payer: TaxPayer, strategy: TaxPayer => Double) = { strategy(payer)}

calculateTax(employee, _.salary * 0.3)  

Page 29: Зачем нужна Scala?

Factory

object Car { def apply(type: String) = { type match { case “Race" => new RaceCar case "Normal" => new NormalCar case _ => throw new Exception } }}

val myCar = Car("Race“)

Page 30: Зачем нужна Scala?

Visitor

trait Expr { //...}

case class Var(value: Int) extends Exprcase class Sum(ex1: Expr, ex2: Expr) extends Expr

object EvalVisitor { def visit(expr: Expression) = expr match { case (Var(v)) => v case (Sum(e1, e2)) => visit(e1) + visit(e2) }}

Page 31: Зачем нужна Scala?

Decoratortrait Reader { type T def read: T}

trait BufferedReader extends Reader { abstract override def read: T = { // ... buffering code super.read }}

class FileReader extends Reader { type T = Char def read: Char = // ... Read somehow}

val bufferedReader = new FileReader with BufferedReader

Page 32: Зачем нужна Scala?

ОО + ФП = Scala

• Объектная ориентация- Любое значение – объект- Любое действие – вызов метода у объекта

• Функциональная ориентация- Любое действие – вызов функции- Любая функция – значение, которое можно присвоить

переменной или передать другой функции• Scala

- Любое значение – объект- Любое действие – вызов метода у объекта- Любой метод – функция- Любая функция – объект

Page 33: Зачем нужна Scala?

Чистое функциональное прог-ание

• Результат любой функции зависит только от входных параметров

• Любая функция только возвращает результат• А это значит, что напрямую нельзя:

- Менять значения переменных- Модифицировать структуры данных- Менять поля объектов- Бросать исключения- Печатать на консоль и читать с неё- Читать или писать в файл- Рисовать на экране

Page 34: Зачем нужна Scala?

Работе со строками

• В Java – функциональный подход• В Ruby – не функциональный подход

Page 35: Зачем нужна Scala?

Сравнимdef formatUsers(users: List[User]) = users map (_.userName) filter (_ != "test") mkString ", "

def formatUsers(users: List[User]): String = { val result = new StringBuilder for (i <- 0 until users.size) { val userName = users(i).userName if (userName != "test") { result.append(userName) if (i < users.size - 1) { result.append(", “) } } } return result.toString}

Page 36: Зачем нужна Scala?

Преимущества ФП• Части кода не зависят друг от друга• Код более понятный• Меньше багов• Проще параллелизовать• Проще оптимизировать компилятору

Недостатки ФП• Иногда больше расход ресурсов• Иногда сложнее написать• Иногда невозможно написать

Page 37: Зачем нужна Scala?

kazachonak.com

Скоро:• Функциональное реактивное

программирование в браузере на Scala• По аналогии с KnockoutJS, EmberJS, JavaFX,

C# Rx

Page 38: Зачем нужна Scala?

Изучение Scala

• Уже 27 книг• Бесплатные книги:– Scala for the Impatient

Cay Horstmann– Programming in Scala

Martin Odersky, Lex Spoon, Bill Venners– Programming Scala

Alex Payne, Dean Wampler• Статья для Java’истов: Scala for Java Refugees

Page 39: Зачем нужна Scala?

Scala IDE

• Коммандная строка Scala REPL• Eclipse• IntelliJ IDEA• NetBeans• Emacs• TextMate• …• Kojo – развлекательная Scala для детей

Page 40: Зачем нужна Scala?

Вопросы?