SlideShare uma empresa Scribd logo
1 de 40
Зачем нужна Scala?

      Александр Казачёнок
Scala в двух словах



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

• Возможности IDE как в Java
Ruby или Java?
• Ruby
  меньше кода        => меньше багов

• Java
  умный компилятор   => меньше багов

• Scala
  меньше кода        => меньше багов
  умный компилятор   => меньше багов
Erlang или Java?
• Java быстрее.
  JVM быстрее Erlang VM.

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

• Scala быстрее.
  JVM быстрее Erlang VM.
  Проще создавать мастштабируемые прил.
Мартин Одерски
•   Придумал Scala
•   Написал компилятор Scala
•   Написал компилятор Java
•   Соавтор Java generics


• Смешанные Scala+Java проекты в Eclipse, etc
• Microsoft спонсирует Scala.NET
• Компиляция в JavaScript с Google Web Toolkit
Джеймс Гослинг (создатель Java)
Джеймс Страчан (создатель Groovy)
Алекс Пейн (Twitter API Lead)
Scala в работе
Элитарность Scala
InfoQ: Тяжело ли найти разработчиков на Scala?
Дэвид Поллак:
   Нет. Найти хороших Scala разработчиков легко.
  Я могу организовать отличную команду из 10
  человек, готовую к работе на следующей неделе.
  Они не будут дешёвыми (средняя цена $250/час
  плюс то, что возьму я). Они не будут локальными.
  Но они будут отличными.
  Тяжело найти аутсорсовую команду из 25 Scala
  разработчиков за $40/час.
Количество фич в Scala
• Намного меньше, чем в C++ или C#
• Сравнимо с Java. Из Java удалены:
  static члены
  примитивные типы
  break и continue
  особое понятие об интерфейсах
  wildcard’ы
  raw типы
  enum’ы
• Фичи Scala более унифицированные и гибкие
Пример кода на Java
public 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;
   }
Пример кода на 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;
    }
Пример кода на 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 + ")";
    }
}
То же самое на Scala



case class Person(firstName: String, lastName: String)
Использование
• Java
     Person mr = new Person("Bob", "Dobbelina");
     Person miss = new Person("Roberta", "MacSweeney");
     Person mrs = miss.withLastName(mr.getLastName());


• Scala
     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)
Коллекции

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)
    }
}
Коллекции
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
}
БАГ!



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

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




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




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

val userNames = users map (_.userName)




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




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


userNames.mkString(", “)




users map (_.userName) mkString ", "
formatUsers версия 2.0


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



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

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




• …
  ScalaCL => граф.карта => быстрее в 10-100
  раз
Java + Google Collections
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);
 }
Паттерны проектирования банды 4-х
• Написание повторно используемого кода
  на Java требует больших усилий
• На динамических языках и Scala многие из
  этих паттернов тривиальны
• Критика паттернов Питером Норвигом
  (директор по исследованиям в Google Inc.)
• ОО тоже когда-то было паттерном
Singleton


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



val entry = Registry.getEntry
Strategy


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



calculateTax(employee, _.salary * 0.3)
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“)
Visitor

trait Expr {
  //...
}

case class Var(value: Int) extends Expr
case 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)
  }
}
Decorator
trait 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
ОО + ФП = Scala
•       Объектная ориентация
    -     Любое значение – объект
    -     Любое действие – вызов метода у объекта
•       Функциональная ориентация
    -     Любое действие – вызов функции
    -     Любая функция – значение, которое можно присвоить
          переменной или передать другой функции
•       Scala
    -     Любое значение – объект
    -     Любое действие – вызов метода у объекта
    -     Любой метод – функция
    -     Любая функция – объект
Чистое функциональное прог-ание
•       Результат любой функции зависит только от
        входных параметров
•       Любая функция только возвращает результат
•       А это значит, что напрямую нельзя:
    -     Менять значения переменных
    -     Модифицировать структуры данных
    -     Менять поля объектов
    -     Бросать исключения
    -     Печатать на консоль и читать с неё
    -     Читать или писать в файл
    -     Рисовать на экране
Работе со строками
• В Java – функциональный подход
• В Ruby – не функциональный подход
Сравним
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
}
Преимущества ФП
• Части кода не зависят друг от друга
• Код более понятный
• Меньше багов
• Проще параллелизовать
• Проще оптимизировать компилятору

Недостатки ФП
• Иногда больше расход ресурсов
• Иногда сложнее написать
• Иногда невозможно написать
kazachonak.com
Скоро:
• Функциональное реактивное
   программирование в браузере на Scala
• По аналогии с
   KnockoutJS, EmberJS, JavaFX, C# Rx
Изучение 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
Scala IDE
•   Коммандная строка Scala REPL
•   Eclipse
•   IntelliJ IDEA
•   NetBeans
•   Emacs
•   TextMate
•   …
•   Kojo – развлекательная Scala для детей
Вопросы?

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Автоматизация тестирования многопоточности
Автоматизация тестирования многопоточностиАвтоматизация тестирования многопоточности
Автоматизация тестирования многопоточности
 
Bytecode
BytecodeBytecode
Bytecode
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Основы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрованияОсновы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрования
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с MavenКурс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-выводКурс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 

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

Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
Ontico
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 

Semelhante a Зачем нужна Scala? (20)

Scala for android
Scala for androidScala for android
Scala for android
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
Scala on android
Scala on androidScala on android
Scala on android
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Kotlin
KotlinKotlin
Kotlin
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 

Mais de Vasil Remeniuk

Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
Vasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
Vasil Remeniuk
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
Vasil Remeniuk
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
Vasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
Vasil Remeniuk
 

Mais de Vasil Remeniuk (20)

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
 

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

  • 1. Зачем нужна Scala? Александр Казачёнок
  • 2. Scala в двух словах • Краткость кода как в Ruby • Возможности IDE как в Java
  • 3. Ruby или Java? • Ruby меньше кода => меньше багов • Java умный компилятор => меньше багов • Scala меньше кода => меньше багов умный компилятор => меньше багов
  • 4. Erlang или Java? • Java быстрее. JVM быстрее Erlang VM. • Erlang быстрее. Проще создавать мастштабируемые прил. • Scala быстрее. JVM быстрее Erlang VM. Проще создавать мастштабируемые прил.
  • 5. Мартин Одерски • Придумал Scala • Написал компилятор Scala • Написал компилятор Java • Соавтор Java generics • Смешанные Scala+Java проекты в Eclipse, etc • Microsoft спонсирует Scala.NET • Компиляция в JavaScript с Google Web Toolkit
  • 10. Элитарность Scala InfoQ: Тяжело ли найти разработчиков на Scala? Дэвид Поллак: Нет. Найти хороших Scala разработчиков легко. Я могу организовать отличную команду из 10 человек, готовую к работе на следующей неделе. Они не будут дешёвыми (средняя цена $250/час плюс то, что возьму я). Они не будут локальными. Но они будут отличными. Тяжело найти аутсорсовую команду из 25 Scala разработчиков за $40/час.
  • 11. Количество фич в Scala • Намного меньше, чем в C++ или C# • Сравнимо с Java. Из Java удалены: static члены примитивные типы break и continue особое понятие об интерфейсах wildcard’ы raw типы enum’ы • Фичи Scala более унифицированные и гибкие
  • 12. Пример кода на Java public 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; }
  • 13. Пример кода на 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; }
  • 14. Пример кода на 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 + ")"; } }
  • 15. То же самое на Scala case class Person(firstName: String, lastName: String)
  • 16. Использование • Java Person mr = new Person("Bob", "Dobbelina"); Person miss = new Person("Roberta", "MacSweeney"); Person mrs = miss.withLastName(mr.getLastName()); • Scala 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)
  • 17. Коллекции 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) } }
  • 18. Коллекции 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 }
  • 20. filter val resultUsers = users.filter(user => user.userName != "test") val resultUsers = users filter (user => user.userName != "test") val resultUsers = users filter (_.userName != "test")
  • 21. map val userNames = users map (_.userName) val userNames = users map (user => user.userName) val userNames = users.map(user => user.userName)
  • 22. mkString userNames.mkString(", “) users map (_.userName) mkString ", "
  • 23. formatUsers версия 2.0 def formatUsers(users: List[User]) = users map (_.userName) filter (_ != "test") mkString ", " • Нет бага :-) • Всего 3 шага • Каждый шаг имеет смысл сам по себе • Больше повторного использования кода
  • 24. Повторное использование • formatUsers версия 3.0 def formatUsersInParallel(users: List[User]) = formatUsers(users.par) • … ScalaCL => граф.карта => быстрее в 10-100 раз
  • 25. Java + Google Collections 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); }
  • 26. Паттерны проектирования банды 4-х • Написание повторно используемого кода на Java требует больших усилий • На динамических языках и Scala многие из этих паттернов тривиальны • Критика паттернов Питером Норвигом (директор по исследованиям в Google Inc.) • ОО тоже когда-то было паттерном
  • 27. Singleton object Registry { def getEntry(): Entry = { // … } // … } val entry = Registry.getEntry
  • 28. Strategy def calculateTax(payer: TaxPayer, strategy: TaxPayer => Double) = { strategy(payer) } calculateTax(employee, _.salary * 0.3)
  • 29. 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“)
  • 30. Visitor trait Expr { //... } case class Var(value: Int) extends Expr case 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) } }
  • 31. Decorator trait 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
  • 32. ОО + ФП = Scala • Объектная ориентация - Любое значение – объект - Любое действие – вызов метода у объекта • Функциональная ориентация - Любое действие – вызов функции - Любая функция – значение, которое можно присвоить переменной или передать другой функции • Scala - Любое значение – объект - Любое действие – вызов метода у объекта - Любой метод – функция - Любая функция – объект
  • 33. Чистое функциональное прог-ание • Результат любой функции зависит только от входных параметров • Любая функция только возвращает результат • А это значит, что напрямую нельзя: - Менять значения переменных - Модифицировать структуры данных - Менять поля объектов - Бросать исключения - Печатать на консоль и читать с неё - Читать или писать в файл - Рисовать на экране
  • 34. Работе со строками • В Java – функциональный подход • В Ruby – не функциональный подход
  • 35. Сравним 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 }
  • 36. Преимущества ФП • Части кода не зависят друг от друга • Код более понятный • Меньше багов • Проще параллелизовать • Проще оптимизировать компилятору Недостатки ФП • Иногда больше расход ресурсов • Иногда сложнее написать • Иногда невозможно написать
  • 37. kazachonak.com Скоро: • Функциональное реактивное программирование в браузере на Scala • По аналогии с KnockoutJS, EmberJS, JavaFX, C# Rx
  • 38. Изучение 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
  • 39. Scala IDE • Коммандная строка Scala REPL • Eclipse • IntelliJ IDEA • NetBeans • Emacs • TextMate • … • Kojo – развлекательная Scala для детей