2013-06-17 3 views
2

Скажем, у меня есть класс Caller, который вызывает методы другого класса (т.е. Abc) в рубине:Украшать все методы класса

class Caller 
    def run 
     abc = Abc.new 
     abc.method1 
     abc.method2 
    end 
end 

class Abc 
    def method1 
     puts 'Method1 etc' 
    end 
    def method2 
     puts 'Method2 etc' 
    end 
end 

caller = Caller.new 
caller.run 

Каждый раз, когда метод в классе Abc называется, мне нужно, чтобы украсить вызов с префиксом, который показывает имя метода и имя метода Calling Например в приведенном выше примере мне нужен следующий результат:

Caller.run - Method1 etc 
Caller.run - Method2 etc 

Каков наилучший способ сделать это в рубине?

ответ

3

Вы можете создать декоратор, который не будет какой-либо конкретный метод, но будет осуществлять method_missing крюк и завернуть каждый вызов в любой код, который нужно:

class Caller 
    def initialize(object) 
    @object = object 
    end 

    def method_missing(meth, *args, &block) 
    puts 'wrapper' 
    @object.public_send(meth, *args, &block) 
    end 
end 

class YourClass 
    def method1 
    puts "method 1" 
    end 
end 

c = Caller.new(YourClass.new) 

c.method1 

Таким образом, ваш декоратор ненавязчив. Кроме того, вы можете контролировать, какие вызовы методов обертываются (например, определяя белый список или черный список в method_missing). Это довольно четкий способ определения аспектов поведения в хорошо разделенных блоках кода.

+0

Это скорее прокси-сервер, не так ли? В любом случае activesupport предоставляет 'ActiveSupport :: BasicObject' как базовый класс для создания прокси. стоит посмотреть на –

+0

Это чисто-рубиновый подход. Существует также 'SimpleDelegator' в stdlib, который может служить аналогичной цели. – samuil

+0

В отличие от прокси-сервера и шаблона делегирования - эти соглашения об именах исходят из статически типизированных языков, где они должны быть реализованы совершенно иначе. Ruby гибкая система набора текста делает многие из этих шаблонов устаревшими, так как идентичное поведение может быть реализовано многими способами. – samuil

Смежные вопросы