Що визначає день?
Програмісти часто зосереджуються не на тому, коли створюють нові функції.
Ви можете думати про дані бекенду, дублювання коду або продуктивність. Ці питання важливі. Але вони не є найважливішими.
Я часто припускаюся цієї помилки. Я захоплююся розумними патернами та чистим кодом. Я починаю писати код ще до того, як повністю зрозумію, як користувач використовуватиме цю функцію. Потім я усвідомлюю, що мій код не відповідає бізнес-цілі.
Візьмемо для прикладу додаток-календар.
Користувач натискає на 1 березня, щоб позначити свято. Але замість цього додаток позначає 28 лютого. Це стається через часові пояси.
Розробник використав об'єкт Date. Об'єкт Date представляє конкретний момент у часі.
У Токіо опівночі 1 березня — це все ще 28 лютого в Лондоні. Якщо ваш код використовує методи UTC для збереження дати, день зміщується.
Баг існує тому, що технічна реалізація суперечить бізнес-логіці.
Користувач мислить днями. Користувач не мислить зміщеннями UTC або мілісекундними мітками часу. Він думає: «Я хочу 14 березня».
Якщо ви хочете, щоб ваш код був надійним, ви повинні правильно моделювати домен.
У паперовому календарі дата — це просто рік, місяць і день. У неї немає часового поясу.
Ви можете виправити баг, дотримуючись узгодженості з UTC або місцевим часом. Але це лише тимчасове рішення. Кращий спосіб — використовувати структури даних, які не можуть помилитися.
Замість об'єкта Date використовуйте власний об'єкт:
• Рік: 2026 • Місяць: Березень • День: 1
Це виключає час і часові пояси з рівняння. Це робить баг неможливим.
Так, це потребує більше роботи. Вам доведеться писати утиліти для порівняння дат або пошуку кінця місяця. У вас є дедлайни та спринти, про які варто турбуватися.
Але правильне моделювання домену вбереже вас від розгніваних тікетів у підтримку та багатогодинного налагодження пізніше.
Як каже Ерік Еванс у Domain-Driven Design:
«Для ефективної комунікації код має базуватися на тій самій мові, що використовується для написання вимог».
Перестаньте думати лише як програміст. Почніть думати про бізнес-правила.
