2012 Итого 9 месяцев ▶ Сразу лучший Интернет-банк в России ▶ Хорошие отзывы клиентов ▶ Бешенное развитие в течение года: функционал, безопасность, интерфейс и это не конец...
привносит функциональный подход ООП и ФП дополняют друг друга ООП чище чем в Java: все значения — объекты, все операции — вызов метода Функциональный != Процедурный
class Author(name: String) case class Book(name: String, author: Author) trait BookStore { def buy(bookName: String, money: Money): Book } Чтобы иметь интерфейсы под рукой, можно объявить всё в одном файле: Всё ещё просто!
books.sortBy(rating(author)).head }).headOption Console.print(somethingToRead.map(_.firstPage) .getOrElse("Nothing is there!")) Стандартные методы на все случаи жизни:
время, переиспользуя, или при правках - и недопускать разного поведения и ошибок ▶ Обычно применяются: наследование, параметризация, параметризация типа (generics) ▶ Замыкания и функции над функциями позволяют параметризовать код другим кодом, давая доступ к новому механизму абстракции
T => Boolean):Iterable[T] def map[A](transform: T => A): Iterable[A] Операции с коллекциями так удобно использовать, как раз потому, что стандартные функции можно параметризировать своим поведеднием
"It ain't easy being " + toString) } } class Frog extends Animal with Philosophical { override def toString = "green" } new Frog().philosophize() // It ain't easy being green Помогают выносить общий функцинал без недостатков множественного наследования
programmer is someone who looks both ways before crossing a one-way street." ~ Doug Linder Тотальность — свойство программы, быть определённой для всех входных параметров Scala использует типизацию (type-safety) для проверки корректности при компилляции, где это возможно
readersQueue.peek(); if(reader.favorite.equals(book.author)) { reader.read(book); } Значения может просто не быть! Если значение необязательно, лучше предусмотреть это в модели типов
Option[Reader] = readersQueue.peek if(reader.favorite.equals(book.author)) { reader.read(book) } Теперь программа просто не собралась Разработчик узнал об ошибках сразу, до передачи в тестирование или переноса в бой
управлять с помощью типа возвращаемого значения. Такие значения можно создавать и связывать. Тип вместе с операциями называется Монадой. ▶ ничего не получить, — Option ▶ получить исключение, — Try ▶ занимать время, — Future ▶ работать с диском — IO etc.
val in: Invariant[Object] = Invariant[String] val in: Invariant[String] = Invariant[Object] val co: Covariant[Object] = Covariant[String] val co: Covariant[String] = Covariant[Object] val contra: Contravariant[Object] = Contravariant[String] val contra: Contravariant[String] = Contravariant[Object] Scala позволяет указать вариантность для параметров типа:
immutable val immutable = ... var mutable = ... List, Set, Map, ▶ Immutability — невозможность изменить объект или ссылку после создания. есть также mutable версии
целей ▶ Операции проще и однороднее: нет особенностей, связанных с изменением ▶ Просто работать в многопоточной среде, нет расходов на синхронизацию, возникающих из-за concurrent mutable state
кода, лучше видны последствия, а, благодаря типам, изменения ещё и проверяются компиллятором — меньше вероятность сломать. Выше уровень абстракциии и однородный код — нет необходимости влезать в низкоуровневые детали реализации, можно охватить больше случаев меньшими усилиями.
одного, не самого простого, случая удалось за 30 минут val (operations, offers) = Await.result( future { operationsRepo.readOperations(userId) } zip future { offersRepo.readOffers(userId) }, 60 seconds)
тесты ▶ Длинные цепочки вызовов тяжело отлаживать, что заставляет выносить переменные и разделять код на небольшие методы Что? тесты и небольшие методы? да ладно!
тесты ▶ Длинные цепочки вызовов тяжело отлаживать, что заставляет выносить переменные и разделять код на небольшие методы ▶ Ограниченная поддержка генерации кода в IDE, впрочем генерировать код не очень актуально ▶ На рынке не так много специалистов по Scala, приходится искать заинтересованных ребят, которые хотят делать что-то новое
Та же релизная политика ▶ Доступен код на Java, все библиотеки JVM, старое доброе ООП и императивность мало того, с этого стоит начать Перейти просто администраторам всё знакомо не нужны новые лицензии тестировщики и администраторы в покое если что, всегда есть к чему вернуться,