Автор: Давыденков Михаил
Предпосылки
Цели
Основные положения Data Context Interaction подхода
Назначение контекст-объектов
Структура контекст-объекта
Class MoneyTransfering
# Блок инициализации c назначением ролей,
# Создание карты ролей(хэш ролей),
# Аксессоры, делегирование, валидации
# Блок триггеров
# Приватные методы
# Модули/классы экторов
end
Продвинутое делегирование и гем casting
Гем использует возможность взять метод из модуля и забиндить его к любому объекту. Преимущество над object.extend(Module) в том, что бинд можно отменить с помощью unbind
module Foo
#...
end
method = Foo.instance_method(:bar)
p method.bind(Object.new).call
Разруливание ролей через гем surrounded
Гем использует возможность взять метод из модуля и забиндить его к любому объекту. Преимущество над object.extend(Module) в том, что бинд можно отменить с помощью unbind
module Surrounded
def method_missing(method_name, *args, &block)
if @context && @context.roles_include?(method_name)
@context.role(method_name)
else
super
end
end
end
class User
include Surrounded
end
Немного поработав с этими гемами я пришёл к выводу, что текущая реализация DCI не для продакшна, да и сам подход не без изъянов. Слишком большой оверхед и пляски с ролями. Есть потери производительности. В руби достаточно сложно наметапрограммировать так, чтобы подход было удобно использовать не потеряв при этом производительности в рантайме. Стоит посмотреть для расширения кругозора, но не более.
Пример реализации контекстов в rails приложении