Итак, допустим, я пишу API для приготовления вкусных замороженных тортов. Все это хорошо и задокументировано, но иногда появляется ошибка, или, возможно, пользователь просматривает библиотеку через IRB и перебирает переменную во время прототипирования.
Так я обычно указываю вызывающим абонентам, что параметр не должен быть равен нулю / имеет другие ограничения:
# Cake.rb
def make_cake(cake_type, *arguments)
raise "cake_type required!" unless !cake_type.nil?
raise "cake_type must be in KNOWN_CAKES" unless KNOWN_CAKES.include?(cake_type)
# blah blah blah
end
Однако недавно я рассматривал что-то подобное, используя rspec-expectations
gem:
# Cake.rb
include RSpec::Matchers
def make_cake(cake_type, *arguments)
cake_type.should_not be_nil, "cake_type required"
KNOWN_CAKES.should include(cake_type), "cake_type not found"
end
Плюсы:
- краткий DSL делает его действительно легким для чтения людьми, которые разрабатывают с использованием API.
- RSpec :: Expectations :: ExpectationNotMetError имеет хорошее форматирование исключений, дающее ожидаемое значение по сравнению с фактическим полученным значением.
Против (с?):
- RSpec :: Expectations :: ExpectationNotMetError может быть немного слишком подробным.
Итак, этот подход: хорошая идея или плохая идея? Какие принципы дизайна он нарушает?