Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!10.05.2023
Точна перевірка як антипаттерн
Виявив, на велике диво, що в нас в черзі задач бовтається задача ще з лютого місяця. Причиною стало особлива бізнес-логіка, по якій задача має N
шансів отримати помилку та спробувати пізніше, а на N+1
спробу повинна видати “жорстку” помилку та остаточно закінчитись. (Так, зазвичай черги мають таку функцію вбудовану, але тут не зовсім стандартна черга.)
За цією логікою, задача не могла залишатись в черзі більше як добу. Що трапилось? Умова остаточного виходу була з перевіркою на рівність: attemptNumber == N+1
. Через незрозумілу мені ситуацію, логіка на N+1
спробі не спрацювала — скоріш за все, команда на видалення з черги не була опрацьована. Та на N+2
, N+3
, N+100
-й спробі задача призводила тільки до “мʼякої” помилки.
Інтуїтивно мені завжди хочеться зробити максимально чітку перевірку — якщо я знаю, що гілка має трапитись на N+1
спробі, то так і треба написати? Власне, сьогоднішній випадок показує, що ні. Треба осягнути всі можливі значення змінної, та визначити, що має трапитись в кожному. Тут у нас є дві множини значень, які розгалужують логіку. Все, що до N
, створює “мʼяку” помилку. Все, що після N
, створює “жорстку”. Саме це й має висловлювати умова: attemptNumber > N
.
…Окремий випадок — це дробові числа. Їх взагалі не можна надійно порівнювати точно через особливості обчислень з рухомою комою. Підійде або наближене порівняння: abs(a-b) < EPSILON
, де EPSILON - незначне маленьке значення, або ж, знов-таки, порівняння більше/менше.