Почему люди, как правило, не используют его?
Ну, одна из причин (как упоминается @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
Я Гон пойти с – BroiSatse
являются есть ли недостатки в использовании делегата? –
Посмотрите на исходный код делегата (да, это метод, а не ключевое слово или что-то еще). Под капотом он буквально определяет такой метод, как ваш. Единственное различие заключается в том, что для изменения метода требуется несколько дополнительных опций, но он выполняется только один раз, когда модуль лаяфицирован, а накладные расходы практически отсутствуют, поэтому, короче говоря, нет измеримой разницы. – BroiSatse