36
Как изучить Scala и не открыть портал в ад? Сергей Петунин

Как изучить Scala и не открыть портал в ад (драфт)

  • Upload
    -

  • View
    55

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Как изучить Scala и не открыть портал в ад (драфт)

Как изучить Scala и не открыть портал в

ад?

Сергей Петунин

Page 2: Как изучить Scala и не открыть портал в ад (драфт)

Путь в Scala

• Кривая обучаемости

• Документация

• Лучшие практики

Page 3: Как изучить Scala и не открыть портал в ад (драфт)

Кривая обучаемости

Page 4: Как изучить Scala и не открыть портал в ад (драфт)

Кривая обучаемости: уровни

Прикладной разработчик

Разработчик библиотек

Общий уровень Scala

Beginning A1 Beginning

Intermediate A2 Junior L1 Intermediate

Expert A3 Senior L2 Advanced

Expert L3 Expert

Page 5: Как изучить Scala и не открыть портал в ад (драфт)

Кривая обучаемости: уровни

Прикладной разработчик

Разработчик библиотек

Общий уровень 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 и не открыть портал в ад (драфт)

Implicits: проблематика

Модификация поведения кода, который мы не можем или не хотим изменять:

• Чужие библиотеки (pimp-my-library)

• Неинтрузивные изменения

• Сквозная функциональность

Page 7: Как изучить Scala и не открыть портал в ад (драфт)

Динамические языки: Monkey-patching

class String def upcase self.reverse endend

"hello".upcase=> "olleh"

Отсутствие прослеживаемости!

Page 8: Как изучить Scala и не открыть портал в ад (драфт)

Языки со статической типизацией: Расширения, категории

extension String {

func reverse() -> String {

let revChars = characters.reverse() return String(revChars)

}

}

Page 9: Как изучить Scala и не открыть портал в ад (драфт)

Java

• Аспекты

• Модификация байт-кода

• Рефлексия

Page 10: Как изучить Scala и не открыть портал в ад (драфт)

Java: monkey-patching?

@Before("execution(* *..*Service.*())")public void doBeforeAnyServiceMethod() { System.out.println("Unexpected stuff!");}

Page 11: Как изучить Scala и не открыть портал в ад (драфт)

Scala: implicit defs

implicit def strToInt(s: String): Int = { java.lang.Integer.parseInt(s)}

println(Math.max("5", "6"))

Page 12: Как изучить Scala и не открыть портал в ад (драфт)

Implicit defs: правила

• Marking rule

• Только определения с ключевым словом implicit

• Scope rule

• Импорты одиночного идентификатора

• Объект-компаньон исходного или целевого класса

• One-at-a-time rule

• Применяется только один implicit

• Explicits first

• Если можно обойтись без implicit, то он не применяется

Page 13: Как изучить Scala и не открыть портал в ад (драфт)

Implicit defs: прослеживаемость

object MyImplicits {

implicit def strToDouble(s: String): Double = { java.lang.Double.parseDouble(s) // s.toDouble ??? }

}

Page 14: Как изучить Scala и не открыть портал в ад (драфт)

Implicit defs: прослеживаемость

Page 15: Как изучить Scala и не открыть портал в ад (драфт)

Implicit defs: прослеживаемость

Page 16: Как изучить Scala и не открыть портал в ад (драфт)

Документация

Page 17: Как изучить Scala и не открыть портал в ад (драфт)

Документация: Spring

Page 18: Как изучить Scala и не открыть портал в ад (драфт)

Документация: Spring

Page 19: Как изучить Scala и не открыть портал в ад (драфт)

Документация: Play

Page 20: Как изучить Scala и не открыть портал в ад (драфт)

Документация: Play

Page 21: Как изучить Scala и не открыть портал в ад (драфт)

Построитель запросов в 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 и не открыть портал в ад (драфт)

Монады

• Операция return (в Scala — конструктор)

• return :: a -> m a

• Операция bind (в Scala — map/flatMap)

• (>>=) :: m a -> (a -> m b) -> m b

• Монадические законы

Page 23: Как изучить Scala и не открыть портал в ад (драфт)

Монада List и for-включение

// декартово произведение списков // с использованием for-включения: val peoplePositions = for { person <- people position <- positions } yield s"$person, $position"

Page 24: Как изучить Scala и не открыть портал в ад (драфт)

Монада List без сахара

// декартово произведение списков // прямым вызовом flatMap и map: val peoplePositions2 = people.flatMap { person => positions.map { position => s"$person, $position" } }

Page 25: Как изучить Scala и не открыть портал в ад (драфт)

Монада 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 и не открыть портал в ад (драфт)

Монада Future без сахара

val composedFuture2 = getFuture1.flatMap { result1 => getFuture2(result1).map { result2 => result2 } }

Page 27: Как изучить Scala и не открыть портал в ад (драфт)

Построитель запросов в 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 и не открыть портал в ад (драфт)

Действия в Slick: ещё одна монада

// делаем из запроса DBIO-действиеval action1 = monadicInnerJoin.result

// заворачиваем действие в транзакциюval txAction1 = action1.transactionally

Page 29: Как изучить Scala и не открыть портал в ад (драфт)

Действия в Slick: ещё одна монада

// делаем DBIO-действие из какой-то // произвольной функцииval action2 = DBIO.successful { println("Делаем что-то в транзакции...")}

Page 30: Как изучить Scala и не открыть портал в ад (драфт)

Действия в Slick: ещё одна монада

// делаем композитное действие // из четырёх действийval compAction = for { result <- action1 _ <- action2 personCount <- action3 phoneCount <- action4} yield personCount + phoneCount

val actionFuture = db.run(compAction.transactionally)

Page 31: Как изучить Scala и не открыть портал в ад (драфт)

Лучшие практики

Page 32: Как изучить Scala и не открыть портал в ад (драфт)

Лучшие практики: Dependency Injection

• Cake pattern

• Структурная типизация

• Implicits

• Reader Monad

• DI-фреймворки

Page 33: Как изучить Scala и не открыть портал в ад (драфт)

Self type

trait Persistable { def persist()}

trait DomainObject { this: Persistable => // USES-A

def businessLogic() = { // ... persist() }}

Page 34: Как изучить Scala и не открыть портал в ад (драфт)

Лучшие практики: Dependency Injection

Page 35: Как изучить Scala и не открыть портал в ад (драфт)

Итоги

• Кривая обучения

• Да, она крутая — учиться придётся много.

• Документация

• Её недостаточно, изучайте код и концепции.

• Лучшие практики

• Их много, выбирайте с умом.

Page 36: Как изучить Scala и не открыть портал в ад (драфт)

Спасибо за внимание!Сергей Петунин

[email protected]@forketyforkforketyfork