Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Типы и код, который не ломается

Типы и код, который не ломается

Talk by Alexey Demedeckiy

Рассказ о том, как сильная типизация помогает программисту избегать ошибок при разработке. А именно

- Возможности фантомных типов
- Раннее обнаружение ошибок
- Юнит-тестирование

This talk was made for CocoaFriday #2 ( https://cocoaheads.org.ua/cocoafriday/2 ) which took place Apr 5, 2019.

Video: https://youtu.be/tl4DW11HWuk

Db84cf61fdada06b63f43f310b68b462?s=128

CocoaHeads Ukraine

April 05, 2019
Tweet

Transcript

  1. СИЛЬНЫЕ ТИПЫ Слабые люди

  2. ПИСАТЬ КОД СЛОЖНО

  3. ПРАВИЛЬНО ПИСАТЬ КОД ОЧЕНЬ СЛОЖНО

  4. ОШИБКИ ЕСТЬ ВСЕГДА

  5. КТО НАХОДИТ ОШИБКИ?

  6. ПОЛЬЗОВАТЕЛЬ

  7. ТЕСТИРОВЩИК

  8. ПРОГРАММИСТ

  9. АССЕРТЫ

  10. ЮНИТ ТЕСТЫ

  11. ЛИНТЕР

  12. КОМПИЛЯТОР

  13. func welcomeUserMessage (name: String)-> String

  14. КАК ВАШ КОД ВИДИТ КОЛЛЕГА?

  15. func welcomeUserMessage (name: String)-> String

  16. КАК КОМПИЛЯТОР ВИДИТ ВАШ КОД?

  17. func welcomeUserMessage (name: String)-> String

  18. func encodeMessage( message: Data, key: Data) -> Data

  19. func decodeMessage( key: Data, payload: Data) -> Data

  20. func decodeMessage( key: EncryptionKey, payload: Payload) -> Message

  21. struct EncryptionKey { let data: Data }

  22. ФАНТОМНЫЕ ТИПЫ

  23. struct Id<Value, Tag> { let value: Value }

  24. struct User { let id: Id<Int, Tag> enum Tag {}

    }
  25. БОЛЬШЕ ЧЕМ ТИПЫ

  26. if props.isActive { view.hidden = false } else { view.hidden

    = true }
  27. if props.isActive { ... view.hidden = false ... } else

    { ... view.hidden = true ... }
  28. view.hidden = run { if props.isActive { return false }

    else { return true } }
  29. func run<T>( code: () -> T) -> T { return

    code() }
  30. КОРРЕКТНОСТЬ БЕЗ ВАРИАНТОВ

  31. struct EventFeed { let events: [Event] let active: Event }

  32. struct EventFeed { let events: [Event] let active: Int }

  33. struct EventFeed { let past: [Event] let active: Event let

    future: [Event] }
  34. extension EventFeed { let all: [Event] }

  35. БУЛЕВЫЕ БУДНИ

  36. struct Event { let isAssigned: Bool let isAccepted: Bool let

    user: User? }
  37. struct Event { let status: Status enum Status { case

    unassigned case assigned(User) case accepted(User) } }
  38. enum Event { case unassigned case assigned(User) case accepted(User) }

  39. ЗА ГРАНЬЮ

  40. None
  41. total append : Vect n a -> Vect m a

    -> Vect (n + m) a append Nil ys = ys append (x :: xs) ys = x :: append xs ys
  42. СПАСИБО