Друкарня від WE.UA

Що робити зі станом

Він вирішує проблеми зі станами

Спробую написати коротше та зрозуміліше.( Можливо загубив деталі )

Стан: : Краще почати з історії

Не так давно, я почав розробку власного телеграм боту. Бот має chain-message структуру, тобто коли користувач натискає кнопку/викликає команду/пише звичайне повідомлення спрацьовує задана функція з заданими параметрами з кнопки( вони знаходяться в полі callback_id ), а для того щоб передавати якісь параметри… ну…. я їх просто передавав за допомогою нижьної лінії. Вони мали ось такий вигляд:

superUsefulMethod_6317185824_saIgk3wO_10_require

…де метод superUseful приймає user_id, file_id якогось малюнку, айді пакунка, і вже якась побічна дія.

Тобто ідея була кожного разу акумулювати параметри за допомогою купи функцій та в кінці їх виконувати в кінечній функції.

Так, саме так я й передавав всі данні в колбеки з кнопок, зберігав їх в базі данних прив’язаних до користувача. Для спрощення цієї процедури я ще створював допоміжні методи….

@required()
@action("cb")
async admSendMessage()

@required()
@action("msg")
async admSendMessage2(...args: string[])

@required()
@action("msg")
async admSendMessage3(...args: string[])

До речі так, у зв’язку з використанням TypeScript це ще я прикрасив декораторами. Але повертаючись до теми, структура проєкту мала дууууже жахливий вигляд, й читаємість коду була екстримально малою.

Після довгих роздумів я ризикнув ( ну точніше як ризикнув, нічого втрачати, аудиторія бота 30 людей ) й створив окрему табличку в БД:

(Я прибрав зайвий контент з панелькі)

model Action {
  id           String    @unique
  name         String
  params       String? // An array actually
  beenExecuted Boolean   @default(false)
  methods      String?
}

І почав її додавати до всіх місць де треба було більше ніж одна дія. І буквально відразу же я зрозумів наскільки це є ефективніше й більш лаконічно.

Стан: : Структура

id - записується в стан користувача з префіксом, щоб можна було зрозуміти.

name/methods - це дозволені функції

params - масив з переданих данних, саме цей елемент відіграє значущу роль у вирішенні комплексних проблем.

Стан: : Як працює

Якщо користувач отримав цей стан і якщо користувач дійшов до функції яка є в name/methods, то вони виконуються з заданими параметрами. Це було чудове рішення, отже тепер я можу створити одну функцію й акумулювати параметри в одній функції.

Код отримав такий вигляд:

@required()
async admSendMessage(userId?: number, text?: String)

Тут всі параметри є опціональні. Насправді кожну наступну дію вони один за одним заповнюються. В самій функції відбувається перевірка на їх наявність.

Стан: : Плюси та Мінуси

Серед плюсів я би виділив:

  • Підвищує читаємість коду.

  • Спрощує всі до однієї функції, хоч і з трішки ускладненою логікую додаткових if/else.

  • Можна передавати більше корисної інформації параметрами.

  • Можна не думати про те, що колися ти досягнеш ліміту телеграму в 64 символа( а це можливо з якимись uuid )

  • Можливість маніпулювання станом.

    • А ще, це полегшує дебаг…

І нажаль є мінуси:

  • Функція стає трішки складніше.

  • Задіяна база данних. Можливо сповільнить асинхронність.

Стан: : Ще варіант

Це вже бонус:

На мою думку можна зберігати в /tmp файл з айді користувача та стана користувача. Через особливості TMPFS це робить все екстримально швидким. Мінус є один, і це те, якщо перезавантажити сервер, то стан зітреться.

Стан: : Кінцівка

Дякую що ви це прочитали. До речі, якщо вам цікаві схожі рішення, можете глянути тут: 🧼 Soap Opera & Art House 🎨

Статті про вітчизняний бізнес та цікавих людей:

  • Як модні бренди формують культуру та впливають на глобальні fashion-тренди

    Модні бренди часто стають символами ідентичності. Вони впливають на вибір способу життя не тільки в одязі — розкішні годинники, парфуми, товари для дому та враження підкріплюють культурні наративи успіху, смаку та вишуканості.

    Теми цього довгочиту:

    Мода
  • Створити блог на Друкарні - швидко, легко та безкоштовно

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

    Теми цього довгочиту:

    Друкарня
  • Чому Google Merchant Center може заблокувати обліковий запис?

    Одним з найбільш ефективних каналів продажів є система Google Merchant Center. Правда, акаунт в ній може бути несподівано заблокований, якщо при його налаштуванні були порушені правила системи. У статті розглянемо підводні камені і дамо відповідь як уникнути блокування

    Теми цього довгочиту:

    Google Merchant Center
  • Бухгалтерський супровід ФОП: сучасний підхід до обліку

    Завдяки розвитку інформаційних технологій, впровадженню сучасних рішень і сервісів процес ведення бухобліку бізнесу став значно простішим і зручним. З іншого боку, ті ж технології додали бухгалтерам роботи – з обліком онлайн-продажів і надходжень у валюті, CRM-системами та ін.

    Теми цього довгочиту:

    Бухгалтерський Облік Фоп
  • Пилосос як базова техніка для щоденного прибирання

    Підтримання чистоти в оселі потребує зручних і продуманих рішень, особливо коли йдеться про догляд за різними поверхнями. У домашньому побуті пилосос залишається базовою побутовою технікою, що поєднує сухе та вологе очищення без зайвих зусиль.

    Теми цього довгочиту:

    Пилососи
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
M
Migawka@migawka we.ua/migawka

Мигаю

1Довгочити
83Прочитання
2Підписники
На Друкарні з 17 квітня

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: