Як зменшити кількість «рухомих частин» у коді

Перекладено ШІ 0 stitcher.io 30 липня, 2026

Іноді звичне моделювання процесів лише ускладнює код зайвими станами та cron-завданнями. Дізнайтеся, як простий рефакторинг логіки публікацій дозволяє значно спростити архітектуру вашого Laravel-проєкту.

Я провів цікавий рефакторинг Aggregate — мого агрегатора контенту. Сервіс збирає публікації з усієї мережі та об'єднує їх в один RSS-фід. Щоб не спамити підписників, я впровадив функцію розкладу: не більше трьох постів на день. Якщо публікацій забагато, вони стають у чергу на наступні дні.

Все починається зі стану поста: PENDING, SCHEDULED або PUBLISHED. Перехід із PENDING — це ручна дія (суть Aggregate у ретельному відборі контенту), а зміна стану зі SCHEDULED на PUBLISHED раніше виконувалася через cron job.

З людської точки зору така логіка виглядає природною: спочатку ми плануємо пост, а потім у потрібний час він публікується. Проте цей автоматичний перехід, прив'язаний до часу, додавав коду зайвої складності:

  • Cron job, що періодично шукає SCHEDULED пости для публікації;
  • Консольна команда як місток між системним cron та кодом;
  • Логіка для розмежування: коли пост має бути SCHEDULED, а коли його можна зробити PUBLISHED миттєво (якщо є вільні слоти);
  • Тести для перевірки переходів станів та коректної взаємодії з ОС.

У такому процесі забагато зайвого «руху». Багато компонентів мають працювати злагоджено: cron, консольна команда, логіка перевірки черги. Це ускладнює тестування, підтримку та дебаг.

Коли я переписував Aggregate на Tempest, я вирішив спростити цей потік. Рішення виявилося елементарним: я видалив стан SCHEDULED і додав поле publicationDate до стану PUBLISHED. Головна хитрість у тому, що publicationDate може бути в майбутньому.

Тепер під час публікації я просто шукаю у базі даних перший вільний слот:

SELECT publicationDate
FROM posts
WHERE 
    publicationDate > :publicationDate
    AND state = "PUBLISHED"
GROUP BY publicationDate
HAVING COUNT(*) >= 3
ORDER BY publicationDate DESC

Запит знаходить найвіддаленішу дату, де вже є три або більше постів, і ми додаємо до неї один день:

$nextAvailableDate = $futureDate->plusDay()->startOfDay();

Ось так ми позбулися зайвого клопоту:

  • Більше ніяких cron jobs;
  • Жодних автоматичних змін стану;
  • Немає потреби перевіряти, чи можна опублікувати пост негайно.

Звісно, є й нюанси: тепер перевірка «видимості» поста залежить не лише від стану, а й від дати. Також постає питання, що робити, якщо запланований пост видаляється і з'являється «вікно» (хоча це можна вирішити коригуванням запиту).

Проте будь-яке архітектурне рішення — це компроміс. Ми обміняли одну складність на іншу, і в моєму випадку вигода очевидна. Як і завжди в розробці — «все залежить від контексту».

Головний урок: моделювання процесу «як у житті» не завжди веде до найкращого технічного рішення. Іноді варто витратити час, щоб адаптувати людську логіку під технічну реалізацію, адже вони не завжди мають збігатися один в один.

Маєте думки з цього приводу? Вперше в історії цього блогу ви можете залишити їх прямо тут, на цій сторінці (просто прокрутіть до коментарів). Якщо щось піде не так (це все ж таки перший запуск 😅) — пишіть мені на email.

Популярні

Інше, що варто прочитати

10 Оновлено 26 червня, 2026

Остаточний посібник з вебхуків у Laravel

Сучасні веб-додатки вимагають миттєвого обміну інформацією, і вебхуки стають незамінними помічниками у цьому процесі. Пориньте у світ вебхуків у Laravel і дізнайтеся, як легко реалізувати цю технологію у своїх проєктах, забезпечуючи безпеку та продуктивність

15 Оновлено 26 червня, 2026

Claude Agent тепер інтегрований в AI Assistant для PhpStorm

Ви коли-небудь задумувалися, як полегшити свою роботу в Laravel? У нашій статті ми розглядаємо, як інтеграція Claude Code в PhpStorm може підвищити вашу продуктивність, спростивши процес написання коду та навчання нових розробників. Читайте далі, щоб дізнатися більше про переваги та функціональність цього потужного поєднання

13 Оновлено 26 червня, 2026

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!