У меня много грязного кода, который включает в себя обертку для выполнения множества отдельных методов в блоке, записи того, сколько времени они потратили на выполнение, а затем отправку этой информации в базу данных для дальнейшего использования.Это делает код очень уродливым.
benchmark_data = Benchmark.realtime do
begin
do_something()
rescue StandardError => e
log_errors("error occurred")
raise e
end
end
write_benchmark_data_to_db(benchmark_data)
Этот код в основном копируется вокруг каждой функции, которую мы хотим тестировать.Есть ли лучший способ сделать это с помощью метапрограммирования?Я хочу исключить весь код тестирования из класса, который я измеряю методами.
Я думал
class Foo
def a()
puts "A"
end
... #repeat for b,c,d,e...
end
f = Foo.new()
add_benchmark(f, [:a,:b,:d]) #records a benchmark event each time f.a,f.b, and f.d are called
У кого-нибудь есть идеи?Если возможно, я бы хотел избежать использования подкласса Foo, потому что тогда подкласс будет необходим для каждого объекта, для которого требуется сравнительный анализ.