Друкарня від 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 🎨

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

  • Бронеплівка для вікон: коли вона доречна та як обрати рішення

    Як бронеплівка утримує уламки, де її встановлюють та чому перед монтажем важливо оцінити стан і конструкцію скління.

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

    Бронеплівка На Вікна
  • Шлейф сучасного смартфону та його призначення

    Шлейф - це тонка пластикова стрічка з ледь видимими доріжками і саме вона зʼєднує важливі компоненти мобільного, без яких він не запрацює. Власники пристроїв Xiaomi, які стикаються з потребою заміни цієї деталі, можуть підібрати відповідний варіант на сайті AKS.UA

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

    Шлейф Для Мобільного
  • Чохли для iPhone 15: повний гід по кольорах, матеріалах і виробниках

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

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

    Чохли Для Iphone
  • Як побудована програма Meest China Academy

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

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

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

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

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

Мигаю

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

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

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

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

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