Я вважаю, що абсолютно вірно використовувати твердження в 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, але концепції стосуються будь-якої мови).