Стендап Сьогодні 📢 Канал в 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 - незначне маленьке значення, або ж, знов-таки, порівняння більше/менше.