Насколько надежным может быть Ruby

Язык ruby часто ругают за то, что он не надежный. Т.е очень легко выстрелить себе в ногу, потому что об ошибке узнаешь только в момент выполнения, в то время как другие языки вроде Java  начнет бить по рукам уже на этапе компиляции. Но, дело в том, что руби создавался языком, на котором можно быстро писать код. Но, это не значит, что когда Вам нужен надежный код, у Вас совсем нет никаких инструментов.

Давайте рассмотрим те инструменты, которые следует применять при написании приложений связанных с финансами и подобных.

Индексы и констрейнты на базу данных

Я уже писал о важности добавления всевозможных ограничений на базу в статье про ошибки новичков База данных Ваш друг и чем больше правил вы ей опишите, тем надежнее будет Ваше приложение. Кроме того, PostgreSQL имеет разные стратегии разрешения конфликтов при транзакции, которые можно и нужно знать и применять. Немного об этом можно почитать на хабре - https://habrahabr.ru/post/317884/

RSpec

Тесты наше все. Они помогают сделать код надежнее, дают возможность еще раз подумать над задачей, позволяют быстро рефакторить код и вносить изменения, баг всегда закрывается с тестом, чтобы быть на 100% уверенным что он никогда не вернется. В особо важных участках кода пишите максимально полные тесты, используйте минимум стабов, ведь от этого зависит надежность вашего кода

Mutant

Если кто-то задавался вопросом: "А почему мы не пишем тесты, на тесты?", то ответ очевиден - придется писать тесты на тесты на тесты. В большинстве случаев для проверки качества тестов используют параметр coverage, который показывает сколько процентов вашего кода покрыто тестами. Но, есть более мощные инструменты и подходы.

Мутационное тестирование - способ проверки качества ваших тестов. Принцип его работы ужасно прост. Вы указываете кусок кода, который хотите проверить. первый раз запускаются тесты, чтобы убедиться что они проходят. Далее каждый кусок кода начинает изменяться случайным образом и снова запускаются тесты. Если код был случайным образом изменен, а ни один тест не упал - значит у вас фиговые тесты.

В руби для этого есть замечательный гем mutant

Контрактное программирование

Даже в компилируемых языках все, что может комплятор, это проверить переменные на соответсвие типов. Но, соответсвие типов не значит что там правильные значения, и поэтому еще очень давно программисты придумали такую штуку как контракты. Тут так же нет ничего сложного, идея невероятно простая. На входе в функцию до тела функции идут проверки на то, что все входные значения соответсвуют каким-то условиям. В противном случае выбрасывается исключение и программа прекращает свое выполнение. Разработчик получает статитсику таких исключений и видит, какие моменты он не учел в своем подходе. В ruby также есть инструмент для написания контрактов, но благодаря мощи языка он позволяет делать это очень элегантно - https://github.com/egonSchiele/contracts.ruby

Просто зацените пару примеров


Contract C::Or[Fixnum, Float] => C::Or[Fixnum, Float]
def double(x)
  2 * x
end

Contract C::ArrayOf[C::Num] => C::Num
def product(vals)
  total = 1
  vals.each do |val|
    total *= val
  end
  total
end

Язык ruby настолько мощный и гибкий, насколько Вам этого надо. При правильном подходе код по надежности ничем не будет уступать компилируемым языкам программирования, а порой и превосходить, потому что с таким мощным инструментом как RSpec можно написать много больше тестов за то же время.

Всем продакшена! И да прибудет с Вами сила!

Комментарии