Команда GitHub сообщила в своём блоге о выпуске Scientist 1.0 — библиотеки Ruby для осторожного рефакторинга критических частей кода, позволяющую быть уверенным в том, что ничего не сломается.
Проекты и их кодовая база обычно находятся в постоянном развитии. Ситуации, когда вам необходимо переписать или заменить какую-то часть системы — неизбежны. Конечно, тут могут помочь тесты, однако если вы хотите сравнить поведение до и после рефакторинга под нагрузкой, то с помощью Scientist можете сделать вот так:
require "scientist"
class MyWidget
def allows?(user)
experiment = Scientist::Default.new "widget-permissions"
experiment.use { model.check_user?(user).valid? } # old way
experiment.try { user.can?(:read, model) } # new way
experiment.run
end
end
Оборачиваете код с исходным работающим поведением в блок use
, а новый, проверяемый, в try
. Команда experiment.run
всегда вернёт именно то, что получилось бы при выполнении use
, но при этом проделает много незаметной и важной работы:
- Решит, запускать или нет код в блоке
try
; - Рандомизирует порядок, в котором выполняются блоки
use
иtry
; - Замеряет время выполнения обоих случаев;
- Сравнивает результаты выполнения
try
с теми, что были получены, используяuse
; - Проглатывает (но записывает) все исключения, случившиеся в
try
; - Публикует всю эту информацию.
Чтобы не создавать каждый раз experiment
можно использовать такой синтаксис:
require "scientist"
class MyWidget
include Scientist
def allows?(user)
science "widget-permissions" do |e|
e.use { model.check_user(user).valid? } # old way
e.try { user.can?(:read, model) } # new way
end # returns the control value
end
end
Если вы не объявите блок try
, то Scientist не будет делать ничего и дополнительных накладных расходов не будет.
Подробнее о Scientist можно почитать на GitHub.