Я вважаю, що абсолютно вірно використовувати твердження в Ruby. Але ви згадуєте дві різні речі:
- Фреймворки xUnit використовують
assert
методи для перевірки очікувань тесту. Вони призначені для використання у вашому тестовому коді, а не в коді вашої програми.
- Деякі мови, такі як C, Java або Python, включають
assert
конструкцію, призначену для використання всередині коду ваших програм, щоб перевірити припущення щодо їх цілісності. Ці перевірки будуються всередині самого коду. Вони є не утилітою під час тестування, а розробкою.
Нещодавно я написав solid_assert: маленька бібліотека Ruby, що реалізує утиліту твердження Ruby, а також допис у своєму блозі, що пояснює її мотивацію . Це дозволяє писати вирази у формі:
assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"
invariant "Lists with different sizes?" do
one_variable = calculate_some_value
other_variable = calculate_some_other_value
one_variable > other_variable
end
І їх можна деактивувати assert
і invariant
оцінити як порожні оператори. Це дозволить вам уникнути будь-яких проблем із продуктивністю на виробництві. Але зверніть увагу, що Прагматичні програмісти рекомендують не деактивувати їх. Деактивувати їх слід лише в тому випадку, якщо вони дійсно впливають на продуктивність.
Щодо відповіді на те, що ідіоматичний спосіб Рубі використовує звичайне raise
твердження, я думаю, йому не вистачає виразності. Одне з золотих правил асертивного програмування - не використання тверджень для нормальної обробки винятків. Це дві абсолютно різні речі. Якщо ви використовуєте однаковий синтаксис для них двох, я думаю, що ваш код буде більш неясним. І звичайно, ви втрачаєте можливість їх деактивувати.
Ви можете бути впевнені, що використання тверджень - це добре, тому що дві класичні книги, як «Прагматичний програміст від мандрівника до майстра» та « Код», присвячують їм цілі розділи та рекомендують їх використання. Існує також приємна стаття під назвою Програмування з твердженнями, яка дуже добре ілюструє, що таке асертивне програмування та коли його використовувати (воно базується на Java, але концепції стосуються будь-якої мови).