ActiveRecord::Callbacks. Готовим правильно.

52
ActiveRecord::Callback s Готовим правильно Павел Габриель / @alovak

description

В презентации затронуты основные проблемы связанные с использованием ActiveRecord::Callbacks, а также предложены способы их избежать.

Transcript of ActiveRecord::Callbacks. Готовим правильно.

Page 1: ActiveRecord::Callbacks. Готовим правильно.

ActiveRecord::CallbacksГотовим правильно

Павел Габриель / @alovak

Page 2: ActiveRecord::Callbacks. Готовим правильно.

AR::Callbacks

before_create / save / update / validateafter_*

Page 3: ActiveRecord::Callbacks. Готовим правильно.
Page 4: ActiveRecord::Callbacks. Готовим правильно.

Что не так с AR::Callbacks?

Page 5: ActiveRecord::Callbacks. Готовим правильно.

“That’s a total of twelve callbacks,

which gives you immense power to react and prepare for each state

in the ActiveRecord life cycle.”

— active_record/callbacks.rb

Page 6: ActiveRecord::Callbacks. Готовим правильно.
Page 7: ActiveRecord::Callbacks. Готовим правильно.
Page 8: ActiveRecord::Callbacks. Готовим правильно.
Page 9: ActiveRecord::Callbacks. Готовим правильно.
Page 10: ActiveRecord::Callbacks. Готовим правильно.
Page 11: ActiveRecord::Callbacks. Готовим правильно.

“That’s Ruby, which gives you

immense power to do, you know,pretty much anything, ever”

— Ernie Miller

Page 12: ActiveRecord::Callbacks. Готовим правильно.

Google

“Are ActiveRecord Callbacks Any Good?”

“ActiveRecord Callbacks are Unreasonable”

“Rails, callbacks, workers, and the race you never expected to lose”

Page 13: ActiveRecord::Callbacks. Готовим правильно.

“ActiveRecord's Callbacks Ruined My Life”

Page 14: ActiveRecord::Callbacks. Готовим правильно.
Page 15: ActiveRecord::Callbacks. Готовим правильно.
Page 16: ActiveRecord::Callbacks. Готовим правильно.
Page 17: ActiveRecord::Callbacks. Готовим правильно.
Page 18: ActiveRecord::Callbacks. Готовим правильно.
Page 19: ActiveRecord::Callbacks. Готовим правильно.

В чем же проблема?

Page 20: ActiveRecord::Callbacks. Готовим правильно.

Проблема?

Page 21: ActiveRecord::Callbacks. Готовим правильно.

Single Responsibility Principle

Page 22: ActiveRecord::Callbacks. Готовим правильно.

“A class should do the smallest

possible useful thing; that is,it should have

a single responsibility.”

— Sandi Metz

Page 23: ActiveRecord::Callbacks. Готовим правильно.

SRP Violation

К лишнему весу ..

Page 24: ActiveRecord::Callbacks. Готовим правильно.

SRP Violation

К усложнению кода

Page 25: ActiveRecord::Callbacks. Готовим правильно.

SRP Violation

К сложным тестам

Невозможности повторного использования

И т.д.

Page 26: ActiveRecord::Callbacks. Готовим правильно.

Варианты решений

Page 27: ActiveRecord::Callbacks. Готовим правильно.

Вариант с Dependency Injection

Page 28: ActiveRecord::Callbacks. Готовим правильно.
Page 29: ActiveRecord::Callbacks. Готовим правильно.
Page 30: ActiveRecord::Callbacks. Готовим правильно.
Page 31: ActiveRecord::Callbacks. Готовим правильно.
Page 32: ActiveRecord::Callbacks. Готовим правильно.
Page 33: ActiveRecord::Callbacks. Готовим правильно.

Вариант с Service

Page 34: ActiveRecord::Callbacks. Готовим правильно.
Page 35: ActiveRecord::Callbacks. Готовим правильно.
Page 36: ActiveRecord::Callbacks. Готовим правильно.
Page 37: ActiveRecord::Callbacks. Готовим правильно.

Вариант с Events/Signals

Page 38: ActiveRecord::Callbacks. Готовим правильно.
Page 39: ActiveRecord::Callbacks. Готовим правильно.
Page 40: ActiveRecord::Callbacks. Готовим правильно.
Page 41: ActiveRecord::Callbacks. Готовим правильно.
Page 42: ActiveRecord::Callbacks. Готовим правильно.

ActiveSupport::Notifications

Page 43: ActiveRecord::Callbacks. Готовим правильно.
Page 44: ActiveRecord::Callbacks. Готовим правильно.
Page 45: ActiveRecord::Callbacks. Готовим правильно.

Wisper (gem)

Page 46: ActiveRecord::Callbacks. Готовим правильно.
Page 47: ActiveRecord::Callbacks. Готовим правильно.
Page 48: ActiveRecord::Callbacks. Готовим правильно.

• Минимизируйте зависимости с помощью Dependency Injection

• Объединяйте несколько моделей в Service

• Используйте Events/Signals

Page 49: ActiveRecord::Callbacks. Готовим правильно.

“Rails makes it natural and easy to

build large, well-designed OOP systems.”

— ????????

Page 50: ActiveRecord::Callbacks. Готовим правильно.

“Rails makes it natural and easy to

build large, well-designed OOP systems.”

— Nobody

Page 51: ActiveRecord::Callbacks. Готовим правильно.

Rails has no brain; use your own!

Page 52: ActiveRecord::Callbacks. Готовим правильно.

Спасибо!

[email protected]