Как изучить scala и не открыть портал в ад (драфт)
TRANSCRIPT
![Page 1: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/1.jpg)
Как изучить Scala и не открыть портал в
ад?
Сергей Петунин
![Page 2: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/2.jpg)
Путь в Scala
• Кривая обучаемости
• Документация
• Лучшие практики
![Page 3: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/3.jpg)
Кривая обучаемости
![Page 4: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/4.jpg)
Кривая обучаемости: уровни
Прикладной разработчик
Разработчик библиотек
Общий уровень Scala
Beginning A1 Beginning
Intermediate A2 Junior L1 Intermediate
Expert A3 Senior L2 Advanced
Expert L3 Expert
![Page 5: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/5.jpg)
Кривая обучаемости: уровни
Прикладной разработчик
Разработчик библиотек
Общий уровень Scala
Beginning A1 (for-expressions)
Beginning
Intermediate A2 Junior L1 Intermediate
Expert A3 Senior L2(advanced for-expressions, self-types)
Advanced
Expert L3 (implicits)
Expert
![Page 6: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/6.jpg)
Implicits: проблематика
Модификация поведения кода, который мы не можем или не хотим изменять:
• Чужие библиотеки (pimp-my-library)
• Неинтрузивные изменения
• Сквозная функциональность
![Page 7: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/7.jpg)
Динамические языки: Monkey-patching
class String def upcase self.reverse endend
"hello".upcase=> "olleh"
Отсутствие прослеживаемости!
![Page 8: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/8.jpg)
Языки со статической типизацией: Расширения, категории
extension String {
func reverse() -> String {
let revChars = characters.reverse() return String(revChars)
}
}
![Page 9: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/9.jpg)
Java
• Аспекты
• Модификация байт-кода
• Рефлексия
![Page 10: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/10.jpg)
Java: monkey-patching?
@Before("execution(* *..*Service.*())")public void doBeforeAnyServiceMethod() { System.out.println("Unexpected stuff!");}
![Page 11: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/11.jpg)
Scala: implicit defs
implicit def strToInt(s: String): Int = { java.lang.Integer.parseInt(s)}
println(Math.max("5", "6"))
![Page 12: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/12.jpg)
Implicit defs: правила
• Marking rule
• Только определения с ключевым словом implicit
• Scope rule
• Импорты одиночного идентификатора
• Объект-компаньон исходного или целевого класса
• One-at-a-time rule
• Применяется только один implicit
• Explicits first
• Если можно обойтись без implicit, то он не применяется
![Page 13: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/13.jpg)
Implicit defs: прослеживаемость
object MyImplicits {
implicit def strToDouble(s: String): Double = { java.lang.Double.parseDouble(s) // s.toDouble ??? }
}
![Page 14: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/14.jpg)
Implicit defs: прослеживаемость
![Page 15: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/15.jpg)
Implicit defs: прослеживаемость
![Page 16: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/16.jpg)
Документация
![Page 17: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/17.jpg)
Документация: Spring
![Page 18: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/18.jpg)
Документация: Spring
![Page 19: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/19.jpg)
Документация: Play
![Page 20: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/20.jpg)
Документация: Play
![Page 21: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/21.jpg)
Построитель запросов в Slick
val monadicInnerJoin = for { c <- coffees s <- suppliers if s.supID === s.id} yield (c.name, s.name)
// Компилируется в SQL:// select x2."COF_NAME", x3."SUP_NAME"// from "COFFEES" x2, "SUPPLIERS" x3// where x2.”SUP_ID” = x3.”SUP_ID”
![Page 22: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/22.jpg)
Монады
• Операция return (в Scala — конструктор)
• return :: a -> m a
• Операция bind (в Scala — map/flatMap)
• (>>=) :: m a -> (a -> m b) -> m b
• Монадические законы
![Page 23: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/23.jpg)
Монада List и for-включение
// декартово произведение списков // с использованием for-включения: val peoplePositions = for { person <- people position <- positions } yield s"$person, $position"
![Page 24: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/24.jpg)
Монада List без сахара
// декартово произведение списков // прямым вызовом flatMap и map: val peoplePositions2 = people.flatMap { person => positions.map { position => s"$person, $position" } }
![Page 25: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/25.jpg)
Монада Future и for-включение
def getFuture1 = Future { "1337"}def getFuture2(string: String) = Future { string.toInt } val composedFuture = for { result1 <- getFuture1 result2 <- getFuture2(result1) } yield result2
![Page 26: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/26.jpg)
Монада Future без сахара
val composedFuture2 = getFuture1.flatMap { result1 => getFuture2(result1).map { result2 => result2 } }
![Page 27: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/27.jpg)
Построитель запросов в Slick
val monadicInnerJoin = for { c <- coffees s <- suppliers if s.supID === s.id} yield (c.name, s.name)
// Компилируется в SQL:// select x2."COF_NAME", x3."SUP_NAME"// from "COFFEES" x2, "SUPPLIERS" x3// where x2.”SUP_ID” = x3.”SUP_ID”
![Page 28: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/28.jpg)
Действия в Slick: ещё одна монада
// делаем из запроса DBIO-действиеval action1 = monadicInnerJoin.result
// заворачиваем действие в транзакциюval txAction1 = action1.transactionally
![Page 29: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/29.jpg)
Действия в Slick: ещё одна монада
// делаем DBIO-действие из какой-то // произвольной функцииval action2 = DBIO.successful { println("Делаем что-то в транзакции...")}
![Page 30: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/30.jpg)
Действия в Slick: ещё одна монада
// делаем композитное действие // из четырёх действийval compAction = for { result <- action1 _ <- action2 personCount <- action3 phoneCount <- action4} yield personCount + phoneCount
val actionFuture = db.run(compAction.transactionally)
![Page 31: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/31.jpg)
Лучшие практики
![Page 32: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/32.jpg)
Лучшие практики: Dependency Injection
• Cake pattern
• Структурная типизация
• Implicits
• Reader Monad
• DI-фреймворки
![Page 33: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/33.jpg)
Self type
trait Persistable { def persist()}
trait DomainObject { this: Persistable => // USES-A
def businessLogic() = { // ... persist() }}
![Page 34: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/34.jpg)
Лучшие практики: Dependency Injection
![Page 35: Как изучить Scala и не открыть портал в ад (драфт)](https://reader034.vdocuments.mx/reader034/viewer/2022051708/589ce6bb1a28abf86d8b64bf/html5/thumbnails/35.jpg)
Итоги
• Кривая обучения
• Да, она крутая — учиться придётся много.
• Документация
• Её недостаточно, изучайте код и концепции.
• Лучшие практики
• Их много, выбирайте с умом.