scala äëÿ android. Ìèô èëè -...

219
Scala äëÿ Android. Ìèô èëè ðåàëüíîñòü Матвей Мальков

Upload: others

Post on 30-Aug-2019

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Scala äëÿ Android. Ìèô èëè ðåàëüíîñòüМатвей Мальков

Page 2: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

2Обо мне

Page 3: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

3Обо мне

Page 4: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

4Обо мне

Page 5: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

5Обо мне

Page 6: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

6

Page 7: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

7Titanium messenger

Page 8: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• end-to-end шифрование

7Titanium messenger

Page 9: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• end-to-end шифрование

• качественный продукт, не MVP

7Titanium messenger

Page 10: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• end-to-end шифрование

• качественный продукт, не MVP

• повышенная безопасность

7Titanium messenger

Page 11: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• end-to-end шифрование

• качественный продукт, не MVP

• повышенная безопасность

• p2p чаты и звонки

7Titanium messenger

Page 12: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• end-to-end шифрование

• качественный продукт, не MVP

• повышенная безопасность

• p2p чаты и звонки

• в релизе

7Titanium messenger

Page 13: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Ïîëîæåíèå äåë

Page 14: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

9Ïîëîæåíèå äåë

Page 15: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

9Ïîëîæåíèå äåë

Page 16: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

9Ïîëîæåíèå äåë

Page 17: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

• ничего больше нет

9Ïîëîæåíèå äåë

Page 18: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

• ничего больше нет

• новые языки

9Ïîëîæåíèå äåë

Page 19: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

• ничего больше нет

• новые языки

• лаконичные

9Ïîëîæåíèå äåë

Page 20: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

• ничего больше нет

• новые языки

• лаконичные

• с хорошим API

9Ïîëîæåíèå äåë

Page 21: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• java 7 версии

• лямбды есть

• ничего больше нет

• новые языки

• лаконичные

• с хорошим API

• JVM-based

9Ïîëîæåíèå äåë

Page 22: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

10Ïðîáëåìû ðàçðàáîòêè

Page 23: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• много корнеркейсов

10Ïðîáëåìû ðàçðàáîòêè

Page 24: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• много корнеркейсов

• уродливость кода

10Ïðîáëåìû ðàçðàáîòêè

Page 25: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• много корнеркейсов

• уродливость кода

• сложные конструкции

10Ïðîáëåìû ðàçðàáîòêè

Page 26: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• много корнеркейсов

• уродливость кода

• сложные конструкции

• ***Fragment на 3500 строк кода

10Ïðîáëåìû ðàçðàáîòêè

Page 27: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• много корнеркейсов

• уродливость кода

• сложные конструкции

• ***Fragment на 3500 строк кода

• многопоточность

10Ïðîáëåìû ðàçðàáîòêè

Page 28: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

11JVM-ñåìåéñòâî

Page 29: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• Kotlin

11JVM-ñåìåéñòâî

Page 30: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• Kotlin

• Scala

11JVM-ñåìåéñòâî

Page 31: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• Kotlin

• Scala

• Clojure

11JVM-ñåìåéñòâî

Page 32: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• Kotlin

• Scala

• Clojure

• Groovy

11JVM-ñåìåéñòâî

Page 33: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Scala

Page 34: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

13Scala

Page 35: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

13Scala

Page 36: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

13Scala

Page 37: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

• REPL

13Scala

Page 38: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

• REPL

• полностью java-совместима

13Scala

Page 39: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

• REPL

• полностью java-совместима

• почти

13Scala

Page 40: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

• REPL

• полностью java-совместима

• почти

• работа с коллекциями

13Scala

Page 41: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ООП + ФП

• супер синтаксис

• REPL

• полностью java-совместима

• почти

• работа с коллекциями

• примеси, лямбды, фьючи и т.д.

13Scala

Page 42: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

14

case class User(name: String, age: Int)

Page 43: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

15

case class User(name: String, age: Int) val u = User("Matvey", 16)

Page 44: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

16

case class User(name: String, age: Int) val u = User("Matvey", 16)println(u.name)

Page 45: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

17

case class User(name: String, age: Int) val u = User("Matvey", 16)println(u.name) !//User(Matvey,16)

Page 46: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

18

def doSmth(u: User): Response = { !//code here}

Page 47: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

19

def doSmth(u: User): Response = { !//code here}var u = User("Matvey", 16)

u = User("Boris", 21)

Page 48: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Çà÷åì ðàçðàáàòûâàòü íà Scala ïîä Android?

Page 49: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

21Çà÷åì ìíå ýòî?

Page 50: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• безопасность

21Çà÷åì ìíå ýòî?

Page 51: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• безопасность

• разделение и переиспользование

21Çà÷åì ìíå ýòî?

Page 52: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• безопасность

• разделение и переиспользование

• хорошая архитектура

21Çà÷åì ìíå ýòî?

Page 53: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• безопасность

• разделение и переиспользование

• хорошая архитектура

• легкое построение DSL и работа с UI

21Çà÷åì ìíå ýòî?

Page 54: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

1. Áåçîïàñíîñòü

Page 55: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

23Option

Page 56: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

23Option

Page 57: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

• 2 варианта

23Option

Page 58: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

• 2 варианта

• Some(smth)

23Option

Page 59: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

• 2 варианта

• Some(smth)

• None

23Option

Page 60: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

• 2 варианта

• Some(smth)

• None

• никаких null

23Option

Page 61: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• простой АТД

• 2 варианта

• Some(smth)

• None

• никаких null

• куча методов для работы

23Option

Page 62: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

24

case class User(name: String, age: Option[Int])

Page 63: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

25

case class User(name: String, age: Option[Int]) val m = User("Matvey", Some(16))val b = User("Boris", None)

Page 64: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

26

case class User(name: String, age: Option[Int]) val m = User("Matvey", Some(16))val b = User("Boris", None)m.age.foreach(println)

Page 65: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

27

case class User(name: String, age: Option[Int]) val m = User("Matvey", Some(16))val b = User("Boris", None)m.age.foreach(println)val borisAge = b.age.getOrElse(27)

Page 66: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

28

case class User(name: String, age: Option[Int]) val m = User("Matvey", Some(16))val b = User("Boris", None)m.age.foreach(println)val borisAge = b.age.getOrElse(27) m.age.filter(_ > 18).map(makeDrink).foreach(_.drink)

Page 67: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

29

val s = Option(getArguments.getString(key))

Page 68: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

30

implicit class AnyToOption[T](x: T) { def option: Option[T] = Option(x)}

val s = Option(getArguments.getString(key))

Page 69: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

31

implicit class AnyToOption[T](x: T) { def option: Option[T] = Option(x)}

val s = getArguments.getString(key).option

val s = Option(getArguments.getString(key))

Page 70: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

32

implicit class AnyToOption[T](x: T) { def option: Option[T] = Option(x)}

val s = getArguments.getString(key).option

val s = Option(getArguments.getString(key))

s.foreach { arg #=> initUiWithArgument(arg)}

Page 71: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

33val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)

Page 72: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

34val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)

Page 73: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

35val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)println(users(0).name)

Page 74: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

36val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)println(users(0).name) !//плохо

Page 75: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

37val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)println(users(0).name) !//плохоusers.headOption.foreach(println) !//хорошо

Page 76: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

38val m = User("Matvey", 16.option)val b = User("Boris", None)val y = User("Yana", 19.option)val users = Seq(m, b, y)println(users(0).name) !//плохоusers.headOption.foreach(println) !//хорошо

val f = users .filter(_.age.isDefined) .find(_.name +== "Matvey")

Page 77: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

39Ïàòòåðí - ìàò÷èíã

Page 78: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• похоже на switch-case

39Ïàòòåðí - ìàò÷èíã

Page 79: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• похоже на switch-case

• мощнее

39Ïàòòåðí - ìàò÷èíã

Page 80: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• похоже на switch-case

• мощнее

• перебор возможных данных

39Ïàòòåðí - ìàò÷èíã

Page 81: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• похоже на switch-case

• мощнее

• перебор возможных данных

• всех!

39Ïàòòåðí - ìàò÷èíã

Page 82: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• похоже на switch-case

• мощнее

• перебор возможных данных

• всех!

• наглядно

39Ïàòòåðí - ìàò÷èíã

Page 83: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

40

def printAge(user: User) = user.age match { case Some(a) #=> println(s"age is $a") case None #=> println("no age for user")}

Page 84: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

41

def printAge(user: User) = user.age match { case Some(a) #=> println(s"age is $a") case None #=> println("no age for user")}

Page 85: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

42

def printAge(user: User) = user.age match { case Some(a) #=> println(s"age is $a") case None #=> println("no age for user")}

Page 86: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

43

def printAge(user: User) = user.age match { case Some(a) #=> println(s"age is $a") case None #=> println("no age for user")}

Page 87: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

44

def printAge(user: User) = user.age match { case Some(14) #=> print("passport required") case Some(40) #=> print("change your passport")}

Page 88: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

45

warning: match may not be exhaustive.It would fail on the following inputs: None, Some((x: Int forSome x not in (14, 40))) def printAge(user: User) = user.age match { ^

def printAge(user: User) = user.age match { case Some(14) #=> print("passport required") case Some(40) #=> print("change your passport")}

Page 89: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

46

def printUser(user: User) = user match {

Page 90: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

47

def printUser(user: User) = user match { case User("Matvey", _) #=> print("Welcome back")

Page 91: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

48

def printUser(user: User) = user match { case User("Matvey", _) #=> print("Welcome back") case User(name, Some(age)) #=> print(s"You're at $age, mister $name")

Page 92: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

49

def printUser(user: User) = user match { case User("Matvey", _) #=> print("Welcome back") case User(name, Some(age)) #=> print(s"You're at $age, mister $name") case User(name, None) #=> print(s"You have no age set, mister $name") }

Page 93: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

50

def printUser(user: User) = user match { case User("Matvey", _) #=> print("Welcome back") case User(name, Some(age)) #=> print(s"You're at $age, mister $name") case User(name, None) #=> print(s"You have no age set, mister $name") }

!//all cases here, no warnings

Page 94: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

51

val users = Seq(m, b, y)

Page 95: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

52

val users = Seq(m, b, y)users.foreach { case User(_, Some(14)) #=> print("make a passport") case _ #=> print("don't worry")}

Page 96: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

53Áåçîïàñíîñòü

Page 97: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ошибиться сложно

53Áåçîïàñíîñòü

Page 98: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ошибиться сложно

• никаких NPE

53Áåçîïàñíîñòü

Page 99: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ошибиться сложно

• никаких NPE

• хорошая читаемость

53Áåçîïàñíîñòü

Page 100: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• ошибиться сложно

• никаких NPE

• хорошая читаемость

• куча операций

53Áåçîïàñíîñòü

Page 101: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

2. Ðàçäåëÿé è âëàñòâóé

Page 102: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

55

Page 103: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

56trait Logger { val tag = getClass.getSimpleName def info(msg: String) = Log.info(tag, msg) }

Page 104: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

57trait Logger { val tag = getClass.getSimpleName def info(msg: String) = Log.info(tag, msg) }

Page 105: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

58trait Logger { val tag = getClass.getSimpleName def info(msg: String) = Log.info(tag, msg) }

Page 106: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

59trait Logger { val tag = getClass.getSimpleName def info(msg: String) = Log.info(tag, msg) }class AwesomeFragment extends Fragment with Logger {}

Page 107: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

60trait Logger { val tag = getClass.getSimpleName def info(msg: String) = Log.info(tag, msg) }class AwesomeFragment extends Fragment with Logger { info("constructor called")}

Page 108: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

61trait Backstack { this: Fragment #=>

Page 109: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

62trait Backstack { this: Fragment #=> def open(f: Fragment) = getChildFragmentManager .beginTransaction() .add(R.id.childRoot, f, null) .commit()}

Page 110: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

63trait Backstack { this: Fragment #=> def open(f: Fragment) = getChildFragmentManager .beginTransaction() .add(R.id.childRoot, f, null) .commit()}

Page 111: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

64trait Backstack { this: Fragment #=> def open(f: Fragment) = getChildFragmentManager .beginTransaction() .add(R.id.childRoot, f, null) .commit()}class AwesomeFragment extends Fragment with Logger with Backstack { info("constructor called") def onConfirmClick = open(new ConfirmFragment()) }

Page 112: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

65trait Backstack { this: Fragment #=> def open(f: Fragment) = getChildFragmentManager .beginTransaction() .add(R.id.childRoot, f, null) .commit()}class AwesomeFragment extends Fragment with Logger with Backstack { info("constructor called") def onConfirmClick = open(new ConfirmFragment()) }

Page 113: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

66

class ChatFragment extends Fragment with MessagesLoading with ChatItemsClicks with ChatActionBar with ChatMenus {

Page 114: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

67

class ChatFragment extends Fragment with MessagesLoading with ChatItemsClicks with ChatActionBar with ChatMenus {

class RootActivity extends BaseActivity with Shaker with BackStack with DrawerHolder {

Page 115: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• модульность

• читаемость

• переиспользуемость

68Ðàçäåëÿé è âëàñòâóé

Page 116: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

3. Èäåàëüíàÿ àðõèòåêòóðà

Page 117: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

70×èñòûå ôóíêöèè

Page 118: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• уверенность в результате

70×èñòûå ôóíêöèè

Page 119: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• уверенность в результате

• легко тестировать

70×èñòûå ôóíêöèè

Page 120: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• уверенность в результате

• легко тестировать

• легко кешировать

70×èñòûå ôóíêöèè

Page 121: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• уверенность в результате

• легко тестировать

• легко кешировать

• легко переиспользовать

70×èñòûå ôóíêöèè

Page 122: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

71Service aka Helper

Page 123: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• только бизнеслогика

71Service aka Helper

Page 124: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• только бизнеслогика

• определенная ее часть

71Service aka Helper

Page 125: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• только бизнеслогика

• определенная ее часть

• только чистые функции (>90%)

71Service aka Helper

Page 126: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• только бизнеслогика

• определенная ее часть

• только чистые функции (>90%)

• scala companion objects

71Service aka Helper

Page 127: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

72

object MediaHelper { def extractFileFromUri(uri: Uri): Future[String] = … def makeMedia(id: Long, source: Source): Option[MediaDb] = … def saveFileToGallery(name: String, mt: MediaType): Future[String] = …

Page 128: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

73

object MediaHelper { def extractFileFromUri(uri: Uri): Future[String] = … def makeMedia(id: Long, source: Source): Option[MediaDb] = … def saveFileToGallery(name: String, mt: MediaType): Future[String] = …

Page 129: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

74

object ChatHelper { def updateChatName(chatId: Long, name: String): Unit = … def updateChatAvatar(chatId: Long, avatar: String): Unit = …

Page 130: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

75

object ChatHelper { def updateChatName(chatId: Long, name: String): Unit = … def updateChatAvatar(chatId: Long, avatar: String): Unit = …

Page 131: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

76

object ChatHelper { def updateChatName(chatId: Long, name: String): Unit = … def updateChatAvatar(chatId: Long, avatar: String): Unit = …

Publisher.ChatChanged.publish( ChatChangedEvent(chatId, name = newName) )

Page 132: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

77

object ChatHelper { def updateChatName(chatId: Long, name: String): Unit = … def updateChatAvatar(chatId: Long, avatar: String): Unit = …

Publisher.ChatChanged.publish( ChatChangedEvent(chatId, name = newName) )

Publisher.ChatChanged.subscribe(onChatChanged) Publisher.ChatChanged.unsubscribe(onChatChanged)

Page 133: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

78

object DbHelper extends DatabaseDsl with BaseDbHelper with KeyDbHelper with ChatDbHelper with MessageDbHelper with NoticeDbHelper with Logger {

Page 134: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

79

object DbHelper extends DatabaseDsl with BaseDbHelper with KeyDbHelper with ChatDbHelper with MessageDbHelper with NoticeDbHelper with Logger {

Page 135: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

80

object DbHelper extends DatabaseDsl with BaseDbHelper with KeyDbHelper with ChatDbHelper with MessageDbHelper with NoticeDbHelper with Logger {

Page 136: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

81Èäåàëüíàÿ àðõèòåêòóðà

Page 137: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• расширяемость

81Èäåàëüíàÿ àðõèòåêòóðà

Page 138: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• расширяемость

• поддерживаемость

81Èäåàëüíàÿ àðõèòåêòóðà

Page 139: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• расширяемость

• поддерживаемость

• тестируемость

81Èäåàëüíàÿ àðõèòåêòóðà

Page 140: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• расширяемость

• поддерживаемость

• тестируемость

• отсутствие лишних действий

81Èäåàëüíàÿ àðõèòåêòóðà

Page 141: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

4. Êðàñèâûå DSL è UI

Page 142: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

83Êðàñèâûå DSL

Page 143: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мини-язык для работы с определенное подсистемой

83Êðàñèâûå DSL

Page 144: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мини-язык для работы с определенное подсистемой

• меньше кода

83Êðàñèâûå DSL

Page 145: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мини-язык для работы с определенное подсистемой

• меньше кода

• надежнее

83Êðàñèâûå DSL

Page 146: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мини-язык для работы с определенное подсистемой

• меньше кода

• надежнее

• лямбды лучше методов

83Êðàñèâûå DSL

Page 147: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мини-язык для работы с определенное подсистемой

• меньше кода

• надежнее

• лямбды лучше методов

• особенно крут в UI

83Êðàñèâûå DSL

Page 148: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

84TypedResources

Page 149: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• пришел с android-sbt-plugin

84TypedResources

Page 150: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• пришел с android-sbt-plugin

• сompile-time типизация айдишников

84TypedResources

Page 151: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• пришел с android-sbt-plugin

• сompile-time типизация айдишников

• жутко удобно

84TypedResources

Page 152: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• пришел с android-sbt-plugin

• сompile-time типизация айдишников

• жутко удобно

• безопасно

84TypedResources

Page 153: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• пришел с android-sbt-plugin

• сompile-time типизация айдишников

• жутко удобно

• безопасно

• приходится компилировать чаще

84TypedResources

Page 154: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

85

TextView tv = (TextView) getView() .findViewById(R.id.title)

Page 155: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

86

TextView tv = (TextView) getView() .findViewById(R.id.title)

val tv = getView.findViewById(R.id.title) .asInstanceOf[TextView]

Page 156: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

87

TextView tv = (TextView) getView() .findViewById(R.id.title)

val tv = getView.findViewById(R.id.title) .asInstanceOf[TextView]

val tv = getView.find(TR.title)

Page 157: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

88

TextView tv = (TextView) getView() .findViewById(R.id.title)

val tv = getView.findViewById(R.id.title) .asInstanceOf[TextView]

val tv = getView.find(TR.title)

Page 158: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

89Ìåòîäû æèçíåííîãî öèêëà

Page 159: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• разрастаются

89Ìåòîäû æèçíåííîãî öèêëà

Page 160: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• разрастаются

• используются всегда

89Ìåòîäû æèçíåííîãî öèêëà

Page 161: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• разрастаются

• используются всегда

• содержат кучу ненужных слов

89Ìåòîäû æèçíåííîãî öèêëà

Page 162: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• разрастаются

• используются всегда

• содержат кучу ненужных слов

90Ìåòîäû æèçíåííîãî öèêëà

@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); !//код здесь}

Page 163: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• разрастаются

• используются всегда

• содержат кучу ненужных слов

91Ìåòîäû æèçíåííîãî öèêëà

@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); !//код здесь}

Page 164: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

92trait HostedFragment extends Fragment with Logger {

Page 165: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

93trait HostedFragment extends Fragment with Logger { protected val onCreateBodies = new ArrayBuffer[() #=> Unit]

Page 166: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

94trait HostedFragment extends Fragment with Logger { protected val onCreateBodies = new ArrayBuffer[() #=> Unit]

Page 167: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

95trait HostedFragment extends Fragment with Logger { protected val onCreateBodies = new ArrayBuffer[() #=> Unit] def onCreate(body: #=> Any): Unit = { onCreateBodies += { () #=> body () } }

Page 168: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

96trait HostedFragment extends Fragment with Logger { protected val onCreateBodies = new ArrayBuffer[() #=> Unit] def onCreate(body: #=> Any): Unit = { onCreateBodies += { () #=> body () } }

Page 169: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

97trait HostedFragment extends Fragment with Logger { protected val onCreateBodies = new ArrayBuffer[() #=> Unit] def onCreate(body: #=> Any): Unit = { onCreateBodies += { () #=> body () } } override def onCreate(savedInstanceState: Bundle): Unit = { super.onCreate(savedInstanceState) onCreateBodies.foreach(_ ()) }

Page 170: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

98

class AwesomeFragment extends HostedFragment { onCreate { !//do some stuff }

Page 171: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

99

class AwesomeFragment extends HostedFragment { onCreate { !//do some stuff } onCreate { !//do more stuff }

Page 172: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

100

class AwesomeFragment extends HostedFragment { onCreate { !//do some stuff } onCreate { !//do more stuff } onViewCreated { getView.find(TR.title).setText("I love Scala") }

Page 173: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

101trait BackStackApi { def clear(): Unit def removeLast(): Unit def last: Option[HostedFragment] def removeUntil[F <: HostedFragment]: Boolean

Page 174: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

102trait BackStackApi { def clear(): Unit def removeLast(): Unit def last: Option[HostedFragment] def removeUntil[F <: HostedFragment]: Boolean

removeUntil[ChatFragment]

Page 175: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

103package object

Page 176: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• глобальная видимость

103package object

Page 177: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• глобальная видимость

• внутри пакета

103package object

Page 178: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• глобальная видимость

• внутри пакета

• содержит переменные и функции

103package object

Page 179: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

104

implicit class RichView[V <: View](view: V) {

Page 180: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

105

implicit class RichView[V <: View](view: V) {

Page 181: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

106

implicit class RichView[V <: View](view: V) {

Page 182: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

107

implicit class RichView[V <: View](view: V) {

Page 183: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

108

implicit class RichView[V <: View](view: V) { def onClick[U](f: #=> U): Unit = { view.setOnClickListener(new View.OnClickListener { def onClick(p: View): Unit = f }) }

Page 184: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

109

implicit class RichView[V <: View](view: V) { def onClick[U](f: #=> U): Unit = { view.setOnClickListener(new View.OnClickListener { def onClick(p: View): Unit = f }) }

Page 185: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

110

val tv = getView.find(TR.title)

Page 186: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

111

val tv = getView.find(TR.title) new RichView(tv).onClick(findLastUnread)

Page 187: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

112

val tv = getView.find(TR.title) new RichView(tv).onClick(findLastUnread) !//не очень

Page 188: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

113

val tv = getView.find(TR.title) new RichView(tv).onClick(findLastUnread) !//не очень

tv.onClick(findLastUnread) !// очень даже

Page 189: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

114

val tv = getView.find(TR.title) new RichView(tv).onClick(findLastUnread) !//не очень

tv.onClick(findLastUnread) !// очень даже

editText.afterTextChanged { text: String #=> info(text)}

Page 190: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

115

@inline def dp(value: Float): Int = math.round(ctx.getResources.getDisplayMetrics.density * value)

Page 191: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

116

@inline def dp(value: Float): Int = math.round(ctx.getResources.getDisplayMetrics.density * value) @inline def color(resId: Int): Int = ctx.getResources.getColor(resId)

Page 192: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

117

@inline def dp(value: Float): Int = math.round(ctx.getResources.getDisplayMetrics.density * value) @inline def color(resId: Int): Int = ctx.getResources.getColor(resId) @inline def string(resId: Int): String = ctx.getString(resId)

Page 193: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

118

val str = string(R.string.APP_VERSION)

Page 194: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

119

val str = string(R.string.APP_VERSION) val title = getView.find(TR.title)

Page 195: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

120

val str = string(R.string.APP_VERSION) val title = getView.find(TR.title)title.setCompoundDrawablePadding(dp(60))

Page 196: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

121

val str = string(R.string.APP_VERSION) val title = getView.find(TR.title)title.setCompoundDrawablePadding(dp(60)) title.setTextColor(color(R.color.red))

Page 197: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Êðàñîòà

Page 198: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

5. Íåïðèÿòíîñòè

Page 199: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

124Íåïðèÿòíîñòè

Page 200: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

124Íåïðèÿòíîñòè

Page 201: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

124Íåïðèÿòíîñòè

Page 202: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

• долгая сборка

124Íåïðèÿòíîñòè

Page 203: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

• долгая сборка

• 120 секунд

124Íåïðèÿòíîñòè

Page 204: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

• долгая сборка

• 120 секунд

• dalvik и ART не любят Scala

124Íåïðèÿòíîñòè

Page 205: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

• долгая сборка

• 120 секунд

• dalvik и ART не любят Scala

• возможность выстрелить в ногу из-за незнания Scala

124Íåïðèÿòíîñòè

Page 206: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• количество методов

• сразу +15к

• долгая сборка

• 120 секунд

• dalvik и ART не любят Scala

• возможность выстрелить в ногу из-за незнания Scala

• поиск сотрудников

124Íåïðèÿòíîñòè

Page 207: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

×òî â èòîãå?

Page 208: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

126Èòîãè

Page 209: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

126Èòîãè

Page 210: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

126Èòîãè

Page 211: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

• позволяет писать восхитительный DSL

126Èòîãè

Page 212: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

• позволяет писать восхитительный DSL

• надежный

126Èòîãè

Page 213: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

• позволяет писать восхитительный DSL

• надежный

• очень много плюшек при правильном использовании

126Èòîãè

Page 214: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

• позволяет писать восхитительный DSL

• надежный

• очень много плюшек при правильном использовании

• долгое время компиляции

126Èòîãè

Page 215: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

• мощнейший инструмент

• требует знаний и умений

• позволяет писать восхитительный DSL

• надежный

• очень много плюшек при правильном использовании

• долгое время компиляции

• сложный поиск команды

126Èòîãè

Page 216: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Android ðàçðàáîòêà ìîæåò áûòü ïðèÿòíîé

Page 217: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Ïîïðîáóéòå Scala è âàì íå çàõî÷åòñÿ îáðàòíî

Page 218: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

129

Ìàëüêîâ Ìàòâåé

Ñïàñèáî

matveyka_jj

H102RPT4

Page 219: Scala äëÿ Android. Ìèô èëè - public.jugru.orgpublic.jugru.org/mobius/2016/spb/day_1/track_2/malkov.pdf · •end-to-end шифрование • качественный

Q & A