Это то, о чем я задумывался годами: эффективнее ли проверять, есть ли у объекта метод, а затем, если он есть, вызывать метод, ИЛИ всегда иметь метод, который ничего не делает, всегда вызывать этот метод? и подклассы должны переопределять этот метод по мере необходимости.
Рассмотрим этот пример:
class Base
def mymethod
respond_to?(:hook) and hook()
puts 'stuff in mymethod'
end
end
class SubClass < Base
def hook
puts 'stuff in hook'
end
end
Итак, в этой ситуации мы в основном добавили обработчик событий. Если у подкласса есть метод с именем hook
, то этот метод вызывается в mymethod
. Это довольно распространенная методика проектирования. Но, конечно, для этого требуется проверить, существует ли метод.
Еще один метод для реализации того же результата заключается в разработке Base
следующим образом:
class Base
def mymethod
hook()
puts 'stuff in mymethod'
end
def hook
end
end
Теперь вы не можете приходится каждый раз проверять, есть ли метод с именем hook
, но вам нужно каждый раз вызывать этот метод, даже если он ничего не делает.
Так что же более эффективно? Что легче понять программисту? Разница настолько мала, что это просто вопрос личных предпочтений?