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

Rails без боли и оверинжиниринга

Rails без боли и оверинжиниринга

Ivan Nemytchenko

July 17, 2020
Tweet

More Decks by Ivan Nemytchenko

Other Decks in Technology

Transcript

  1. bit.ly/pain-overengineering
    PAINLESS RAILS
    «Рельсы без боли и оверинжиниринга»

    View Slide

  2. bit.ly/pain-overengineering
    PAINLESS RAILS
    «Рельсы без боли и оверинжиниринга»

    View Slide

  3. bit.ly/pain-overengineering
    PAINLESS RAILS
    «Рельсы без боли и оверинжиниринга»

    View Slide

  4. bit.ly/pain-overengineering

    View Slide

  5. bit.ly/pain-overengineering
    ПЛАН
    1. Боль ↭ Оверинжиниринг
    2. Теория (Логики и SLA)
    3. Сравнение (Rails, DDD, Dry-rb подходы)
    4. Доп. материалы, что изучать, куда копать.

    View Slide

  6. • Омск
    • Рубист с 2006
    • Фриланс
    • Агенства
    • …

    View Slide

  7. bit.ly/pain-overengineering

    View Slide

  8. bit.ly/pain-overengineering

    View Slide

  9. • Омск
    • Рубист с 2006
    • Фриланс
    • Два агенства
    • Happydev
    • Спикер
    • Белград
    • Гитлаб
    • goodrpogrammer.ru

    View Slide

  10. bit.ly/pain-overengineering
    Боль → ОВЕРИНЖИНИРИНГ
    Доверились рельсам

    View Slide

  11. bit.ly/pain-overengineering
    Боль → ОВЕРИНЖИНИРИНГ
    Доверились рельсам
    Потеряли контроль

    View Slide

  12. ПОП-КУЛЬТУРА
    Роберт Мартин

    View Slide

  13. ПОП-КУЛЬТУРА
    Роберт Мартин
    Мартин Фаулер

    View Slide

  14. ПОП-КУЛЬТУРА
    Роберт Мартин
    Мартин Фаулер
    Фаулер Роберт

    View Slide

  15. ПОП-КУЛЬТУРА
    Роберт Мартин
    Мартин Фаулер
    Фаулер Роберт
    Эрик Эванс

    View Slide

  16. ПОП-КУЛЬТУРА
    SOLID
    Design Patterns
    Domain
    Driven Design

    View Slide

  17. bit.ly/pain-overengineering
    Боль → ОВЕРИНЖИНИРИНГ
    Доверились рельсам
    Потеряли контроль
    Нарулили контроль

    View Slide

  18. bit.ly/pain-overengineering
    Боль → ОВЕРИНЖИНИРИНГ
    Доверились рельсам
    Потеряли контроль
    Нарулили контроль
    Потеряли удовольствие от разработки

    View Slide

  19. railshurts.com/posts
    inem.at

    View Slide

  20. bit.ly/pain-overengineering
    ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ
    ПРОГРАММИСТА
    ООП ООП

    View Slide

  21. bit.ly/pain-overengineering
    ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ
    ПРОГРАММИСТА
    SOLID SOLID

    View Slide

  22. bit.ly/pain-overengineering
    ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ
    ПРОГРАММИСТА
    DDD DDD

    View Slide

  23. • Object oriented approach
    • Functional approach
    • DDD
    • CQRS
    • Event sourcing
    • Microservices
    Название
    идеологии
    ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ
    ПРОГРАММИСТА

    View Slide

  24. В СРЕДНЕМ БИЗНЕСУ
    НУЖНО ОДНО и то же

    View Slide

  25. КОДИНГ - это обслуживающая функция

    View Slide

  26. Случайная сложность
    vs
    НЕОБХОДИМАЯ сложность

    View Slide

  27. Презентер
    Команда
    Адаптер
    Джоба
    Маппер
    JSONB
    Полиси
    Хэндлер
    Случайная vs НЕОБХОДИМАЯ

    View Slide

  28. Случайная vs НЕОБХОДИМАЯ
    ?

    View Slide

  29. Application-логика
    Мысленный эксперимент

    View Slide

  30. Application-логика
    Джобы
    Мэйлеры
    Current user
    Авторизация

    View Slide

  31. bit.ly/pain-overengineering
    Бизнес логика не зависит
    • ни от фрэймворка
    • ни от языка
    • ни от платформы

    View Slide

  32. OSI (Open Systems Interconnection) model

    View Slide

  33. Layered Architecture

    View Slide

  34. Layered Architecture
    Модели
    предметной
    области
    Бизнес
    логика
    Application логика

    View Slide

  35. bit.ly/pain-overengineering
    ЕСТЬ ТРИ Стула…

    View Slide

  36. VANILLA Rails

    View Slide

  37. class User < ApplicationRecord
    validates :email, confirmation: true
    validates :password, confirmation: true
    validates :terms_of_service, acceptance: true
    before_create do
    self.request_id = Current.request_id
    self.user_agent = Current.user_agent
    self.ip_address = Current.ip_address
    end
    end
    VANILLA Rails

    View Slide

  38. VANILLA Rails

    View Slide

  39. VANILLA Rails

    View Slide

  40. В ЧЕМ проблема

    View Slide

  41. VANILLA Rails
    • Два уровня
    • Без жестких границ
    • Логика вперемешку
    • Рельсы активно
    поощряют не думать
    об этом

    View Slide

  42. Ммм, Рельсы?
    А скажи что-нибудь по рельсовому!
    «А щас просто колбэк фиганем»,
    консерны, валидации, Current.user
    Да
    Класс!

    View Slide

  43. Василий, тут это, надо фичу запилить

    View Slide

  44. Василий, тут это, надо фичу запилить
    Возьмем Рельсы?

    View Slide

  45. Василий, тут это, надо фичу запилить
    Возьмем Рельсы?

    View Slide

  46. Название
    идеологии
    ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ
    ПРОГРАММИСТА

    View Slide

  47. bit.ly/pain-overengineering
    Режим «мамкин архитектор»

    View Slide

  48. ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД
    Боль

    View Slide

  49. А у вас правда ООП?
    А скажи что-нибудь по ООП-шному!
    Dependenсy Injection, SOLID, Sandi Metz,
    Service Object, Адаптер, Интерактор!
    Да
    Класс!

    View Slide

  50. ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД
    DDD

    View Slide

  51. А у вас правда DDD?
    А скажи что-нибудь по DDD-шному!
    Bounded Context, Aggregate, Event Sourcing,
    Command Query Responsibility Segregation!
    Да
    Класс!

    View Slide

  52. bit.ly/pain-overengineering
    DOMAIN DRIVEN DESIGN

    View Slide

  53. DDD1 - идейная часть

    View Slide

  54. DDD2 - «Практическая» часть

    View Slide

  55. НаС зАВОРАЖИВАЮТ
    КРАСИВЫЕ СЛОЖНЫЕ ШТУКИ

    View Slide

  56. НаС зАВОРАЖИВАЮТ
    КРАСИВЫЕ СЛОЖНЫЕ ШТУКИ

    View Slide

  57. DDD2 На практике

    View Slide

  58. DDD2 На практике

    View Slide

  59. DDD2 На практике

    View Slide

  60. ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД
    Dry-rb

    View Slide

  61. А у вас правда Dry-rb?
    А скажи что-нибудь по dryrb-шному!
    Монады, Operation, Entity, Repository
    Да
    Класс!
    Success!
    include Import[
    'organisations.libs.token_generator',
    repo: 'repositories.organisation'
    ]
    optional(:tags).maybe(:array?)
    optional(:status).value(!::Core!::Types!::ServiceStatus)

    View Slide

  62. Dry-rb

    View Slide

  63. ЛЕГКО
    vs
    ПРОСТО

    View Slide

  64. Легкость - субъективна
    ЛЕгко vs Просто

    View Slide

  65. Простота - объективна
    ЛЕгко vs Просто

    View Slide

  66. bit.ly/pain-overengineering
    В поисках идеальной архитектуры

    View Slide

  67. bit.ly/pain-overengineering
    Оверинжиниринг
    What you think is what you get

    View Slide

  68. bit.ly/pain-overengineering
    РЕАЛЬНАЯ ЖИЗНЬ
    Пуристам тут не место

    View Slide

  69. Рельсоболь Оверинжиниринг

    ЕСТЬ ТРИ Стула

    View Slide

  70. Рельсоболь Оверинжиниринг
    ?
    ЕСТЬ ТРИ Стула

    View Slide

  71. НЕДОИНЖИНИРИНГ

    View Slide

  72. bit.ly/pain-overengineering

    View Slide

  73. НЕДОИНЖИНИРИНГ
    • Слишком большие классы
    • Слишком большие методы
    • Недостаточно ООП-код
    • Дублирование кода
    • Применили мало паттернов
    • Нужны жесткие границы
    • Надо следовать принципам из поп-культуры
    Решает не те проблемы

    View Slide

  74. ЕСТЬ ТРИ Стула
    Рельсоболь Оверинжиниринг
    Недоинжиниринг

    View Slide

  75. bit.ly/pain-overengineering
    Just enough engineering

    View Slide

  76. 1. ударить молотком - 10 коп.
    2. знать, где - 9.90 руб.
    Just enough engineering

    View Slide

  77. bit.ly/pain-overengineering
    Just enough engineering

    View Slide

  78. bit.ly/pain-overengineering
    Презентер Адаптер Полиморфизм
    Dependency

    Inversion
    Dependency

    Injection
    Функция Класс Наследование Side effects Null Objects
    Exceptions
    Declarative
    Imperative
    Functional
    Object Oriented
    Factory
    Repository
    Value object
    Entity
    Монады
    BPMN
    Railway

    programming
    CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM
    Background

    Jobs
    Domain events
    Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy
    Just enough engineering

    View Slide

  79. bit.ly/pain-overengineering
    Презентер Адаптер Полиморфизм
    Dependency

    Inversion
    Dependency

    Injection
    Функция Класс Наследование Side effects Null Objects
    Exceptions
    Declarative
    Imperative
    Functional
    Object Oriented
    Factory
    Repository
    Value object
    Entity
    Монады
    BPMN
    Railway

    programming
    CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM
    Background

    Jobs
    Domain events
    Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy
    Just enough engineering

    View Slide

  80. bit.ly/pain-overengineering
    Презентер Адаптер Полиморфизм
    Dependency

    Inversion
    Dependency

    Injection
    Функция Класс Наследование Side effects Null Objects
    Exceptions
    Declarative
    Imperative
    Functional
    Object Oriented
    Factory
    Repository
    Value object
    Entity
    Монады
    BPMN
    Railway

    programming
    CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM
    Background

    Jobs
    Domain events
    Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy
    2 руб.
    40 коп.
    =
    Just enough engineering

    View Slide

  81. bit.ly/pain-overengineering
    Презентер Адаптер Полиморфизм
    Dependency

    Inversion
    Dependency

    Injection
    Функция Класс Наследование Side effects Null Objects
    Exceptions
    Declarative
    Imperative
    Functional
    Object Oriented
    Factory
    Repository
    Value object
    Entity
    Монады
    BPMN
    Railway

    programming
    CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM
    Background

    Jobs
    Domain events
    Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy
    Just enough engineering

    View Slide

  82. bit.ly/pain-overengineering
    Айда учиться вместе

    View Slide

  83. bit.ly/pain-overengineering
    НЕ доделывай

    View Slide

  84. bit.ly/pain-overengineering
    Айда учиться вместе

    View Slide

  85. bit.ly/pain-overengineering
    КАК СРАВНИВАТЬ РАЗНЫЕ
    ПОДХОДЫ ?

    View Slide

  86. bit.ly/pain-overengineering
    PAINLESS RAILS
    «Наводим порядок в моделях»
    bit.ly/pain-overengineering

    View Slide