Мои первые мысли примерно такие:
class AbstractBuilder
attr_reader :time_taken
def build_with_timer
started_at = Time.now
build
@time_taken = Time.now - started_at
end
def build
raise 'Implement this method in a subclass'
end
end
class MyBuilder < AbstractBuilder
def build
sleep(5)
end
end
builder = MyBuilder.new.build_with_timer
puts builder.time_taken
Я подозреваю, что есть лучший способ, который предлагает большую гибкость, например, в идеале я хотел бы вызвать 'build' для экземпляра MyBuilder вместо 'build_with_timer' и всегда записывать время выполнения.
Я подумал о том, чтобы использовать alias_method из initialize или даже использовать модуль mixin вместо наследования классов, который переопределил бы метод сборки, вызывающий super в середине (не уверен, сработает ли это). Прежде чем я спустился в кроличью нору, я подумал, что увижу, есть ли установленная практика.