2015-08-19 3 views
1

Я вижу много примеровПочему люди в основном переносят метод I18n.t вместо делегирования?

def t(*args) 
    I18n.t(*args) 
end 

и очень немногих

delegate :t, to: I18n 

По моему мнению честного второе решения семантический лучше. Почему люди склонны не использовать его?

+0

Я Гон пойти с – BroiSatse

+0

являются есть ли недостатки в использовании делегата? –

+1

Посмотрите на исходный код делегата (да, это метод, а не ключевое слово или что-то еще). Под капотом он буквально определяет такой метод, как ваш. Единственное различие заключается в том, что для изменения метода требуется несколько дополнительных опций, но он выполняется только один раз, когда модуль лаяфицирован, а накладные расходы практически отсутствуют, поэтому, короче говоря, нет измеримой разницы. – BroiSatse

ответ

4

Почему люди, как правило, не используют его?

Ну, одна из причин (как упоминается @BroiSatse) заключается в том, что люди просто не знают об этой технике.

С точки зрения байткода разница в нем мало. delegate генерирует примерно тот же метод, с помощью нескольких дополнительных проверок для обеспечения безопасности (respond_to? и т.д.)

Мы, в нашей команде, есть правило: delegate следует использовать, чтобы дать намек на внешних звонящие, что методы являются перенаправляется на другой объект. Как следствие, это должно быть не использоваться только для «сокращения» внутренних вызовов делегированных методов. То есть, если метод не вызывается извне, не используйте на нем delegate, напишите переадресацию самостоятельно.

Таким образом, выбор основан на сообщении, которое мы хотим передать. И да, у нас есть обе формы делегации I18n.t в нашем приложении :)

Например: «потому что они не знают о` методе delegate`»

# use `delegate`, method is called from outside 
class User 
    has_one :address 

    delegate :country, to: :address 
end 

<%= user.country %> 


# only internal callers, do not use `delegate` 
class Exporter 
    # delegate :export, to: :handler 
    def call 
    handler.export 
    end 

    private 

    def handler 
    return something_with_export_method 
    end 
end 
+0

Любовь к конвенции ! – BroiSatse