GitHub выпустил инструмент для рефакторинга критически важных участков кода

Команда 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;
  • Публикует всю эту информацию.

scientist-flow-diagram

Чтобы не создавать каждый раз 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.