'

Политика невмешательства

Понравилась презентация – покажи это...





Слайд 0

Политика невмешательства Как в tulp.ru решена задача сохранения изменений состояния системы


Слайд 1

Постановка задачи Состояние системы Модель А + Модель B + Модель C Требуется просматривать состояние "до" изменения состояние "после" изменения служебную информацию (кто, когда, ...)


Слайд 2

Варианты решения Inline code Callback before_save, after_save Observer paper_trail, act_as_versioned Decorator method_decorators Aspect aspectr, aquarium


Слайд 3

Inline code save_before( a, b, c ); change( a, b, c ); save_after( a, b, c ); Загрязняется основная логика Необходимо поддерживать изменения (не катит)


Слайд 4

Callback before_save :save_state_before after_save :save_state_after Сохранение состояния 1 модели (не группы) Дополнительный код в моделях


Слайд 5

AR::Observer: обычная реализация class UserObserver < ActiveRecord::Observer def after_save(user) … end end Сохранение состояния 1 модели (не группы)


Слайд 6

AR::Observer: реализация через gem class User < ActiveRecord::Base # команда подключения функционала гема has_paper_trail # acts_as_versioned end Сохранение состояния 1 модели (не группы) Дополнительный код в моделях


Слайд 7

Decorator class UserService < MethodDecorators +Log_user_state def approve(user_id) User.find(user_id).approve() Billing.add_user(user_id) Complaint.scope_user(user_id).each(&:close) save! end end Нужно много различных декораторов В коде есть следы (хоть и приемлемо мало) gem install method_decorator


Слайд 8

Aspect Кто знает, что такое АОП?


Слайд 9

Aspect AOP Aspect Advice Join Point Программа … … user.set_role("admin") … … Aspect class UserAspect < AOP advice User, :set_role, options end


Слайд 10

Aspect class Changelog watch UserService, [:approve, :disapprove], { state_before: lambda{ |user_id| … }, state_after: lambda{ … }, state_error: lambda{ … } } end Нет ни единой строчки в моделях/сервисах/etc Все настройки – в одном месте


Слайд 11

Выбор AspectR (2002) Aquarium - gem install aquarium


Слайд 12

Практика Aquarium мощный слишком Упрощение интерфейса более жёсткие требования обработка ошибок спокойный сон после release


Слайд 13

Откат в жизни модератора Детальная трассировка изменений У меня все ходы записаны (с) 12ст Легко откатить изменения Долой коррупцию, распил и откаты!


Слайд 14

Ссылки http://bit.ly/cR400e - AOP @ wikipedia http://bit.ly/15q8bT - Decorator @ wikipedia http://bit.ly/It8d7l - method_decorators http://bit.ly/KXu9ZA - aquarium @ github http://bit.ly/rUyqf - aquarium @ rubyforge


Слайд 15

ВСЕМ


×

HTML:





Ссылка: