AKitavtsev / telegram-vk-bot

BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

Вынести лишнее из хэндла #13

Closed olegromashin closed 3 years ago

olegromashin commented 3 years ago

Сейчас у тебя в одном хэндле как равноправные функции находятся функции, которые отвечают за цикл бота (получить сообщения, отправить и т. д.) и функция запуска самого цикла бота (initSession). initSession внутри себя выполняет всё остальное, поэтому располагать их на одном уровне неправильно. Я предлагаю вынести initSession из хэндла в обычные функции для Телеграма и ВК. Кроме этого не вижу смысла иметь newDict в хэндле, можно тоже вынести как отдельную функцию.

AKitavtsev commented 3 years ago

Пытаюсь испраить Но возникает проблема. Наверное, я что-то не понимаю. По моим понятиям логика бота (которая отражена в модуле Bot не должна зависеть от реализации (Telegram и VK). Или нет? Но, мой бот использует эти две функции , которые мы решили вынести из хандла. Ладно еще initSession. Она вызывается из testException (с которым мы еще не решили, как быть) . testException можно из Bot убрать и продублировать в обеих реализациях. Но, как с newDict,?

AKitavtsev commented 3 years ago

Исправил в части initSession но теперь к ней нельзя обратиться из модуля Bot. По этой причине не стал пока трогать newDict

olegromashin commented 3 years ago

По моим понятиям логика бота (которая отражена в модуле Bot не должна зависеть от реализации (Telegram и VK). Или нет? Но, мой бот использует эти две функции , которые мы решили вынести из хандла.

newDict и так не зависит от реализации. Она же одинаково заполняется и для Телеграма и для ВК. Это тоже самое, что в хэндл функцию map положить initSession, т. е. запуск бота - это не совсем логика бота, это логика приложения. Чтобы бот работал - его надо запустить с какой-то конфигурацией. Поэтому я и предложил вынести эту функцию из хэндла. Для функций логики бота тебе нужна независимость от реализации, поскольку у тебя один модуль для всей логики бота. initSession в этом процессе участие не принимает, у нас нет общей функции для запуска бота. Нам эта функция и не нужна, т. к. общих частей в процессе запуска нет.

testException (с которым мы еще не решили, как быть)

Я надеюсь мы сейчас отрефакторим всё и в другом ишью касательно этой функции придумаем как красиво взаимодействие с ней переделать)

Пиши, если я где-то плохо объяснил или если ты где-то со мной не согласен)

AKitavtsev commented 3 years ago

Нет. Ты неплохо объяснил. И я не не согласен. Просто я не плохо понял.

  1. initSession - для телеги - это, действительно, просто запуск цикла бота. И, если мы выносим ее из хэндла, то она просто не нужна, там мы ее уберем совсем, и запустим loopBoot прямо из main. Но, для ВК - это важная функция, совершающая конкретные действия, без которых цикл бота не запустить и не перезапустить, в случае неприятностей. Почему в логику бота входит только его цикл, а инициализация (без которой цикл не запустить) не входит? А для Телеграм сам факт отсутствия инициализации не входит в логику.
  2. newDict все время все время не дает мне покоя. Функции с виду идентичные в обоих реализации. Но, как это может быть использовано? Ведь newDict разных реализаций обращается к внутренним функциям из различных модулей. И, соответственно, имеют различные зависимости. Вот здесь я что-то конкретно не понимаю. Даже сравнение с map в хэнле не испавмло ситуацию с пониманием
olegromashin commented 3 years ago

initSession для ВК - это важная функция, совершающая конкретные действия, без которых цикл бота не запустить и не перезапустить

предлагаю просто добавить параметр функции loopBot и передавать туда то что надо сделать в случае рестарта для ВК, а для Телеги передавать pure ()

newDict все время все время не дает мне покоя

А, вижу, да, так просто в отдельную функцию newDict не вынести. Одинаковые имена функций ввели меня в заблуждение. Можно было бы тайпкласс создать, кстати.

AKitavtsev commented 3 years ago

Сделано. Давно об этом думал, но до конца не прорисовывалось. Вижу, насколько лучше стало. Еще подумаю, может пополню класс другими функциями

olegromashin commented 3 years ago

А с этим что решил?

предлагаю просто добавить параметр функции loopBot и передавать туда то что надо сделать в случае рестарта для ВК, а для Телеги передавать pure ()

AKitavtsev commented 3 years ago

Не получится. InitSession возвращает IO () именно потому, что она вызывает LoopBoot. А так она готовит параметры, необходимые для запуска LoopBoot.

или я чего не понял в твоем предложении?

olegromashin commented 3 years ago

Не получится. InitSession возвращает IO () именно потому, что она вызывает LoopBoot. А так она готовит параметры, необходимые для запуска LoopBoot.

Не понял тебя) loopBot (initSession botHandle hLogger conf) botHandle hLogger (DataLoop x [] M.empty $ ts x) вот так для ВК не получится?

AKitavtsev commented 3 years ago

Раз ты говоришь, значит должно получиться. Я просто вообще не понимаю, что тут происходит. Какой тип должен быть у loopBot? loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO () ? Это как? Что такое x ? x :: Session Нам бы по этому вопросу как-то по интенсивней пообщаться. А то из-за моей непонятливости это может надолго затянуться. Хотя, конечно, понимаю, твою занятость....

olegromashin commented 3 years ago

loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO () ? Это как?

А вот здесь тебе какая часть непонятна? Аргумент IO ()?

AKitavtsev commented 3 years ago

Непонятно, как его использовать. В какой момент произойдёт вычисление initSession botHandle hLogger conf, и что будет в результате. Вообще, мы говорим о функции InitSection в ее настоящем виде или о какой-то новой? Тип IO() она имеет благодаря действию loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x). И что, получается вроде того:

loopBo (loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x)) botHandle hLogger (DataLoop x [] M.empty $ ts x)?

Понимаю, что ничего не понимаю. Передать функцию в качестве параметра функцию, мне понятно. Но это же что-то другое

olegromashin commented 3 years ago

Вообще, мы говорим о функции InitSection в ее настоящем виде или о какой-то новой? Тип IO() она имеет благодаря действию loopBot botHandle hLogger (DataLoop x [] M.empty $ ts x).

Откуда такой вывод? Попробуй убрать вызов этой функции в качестве эксперимента и посмотреть будет ли ругаться компилятор (желательно перед запуском компиляции самостоятельно попробовать понять ещё раз).

Непонятно, как его использовать. В какой момент произойдёт вычисление initSession botHandle hLogger conf, и что будет в результате.

Вычисление произойдёт в тот момент, когда ты его используешь.

loopBot (initSession botHandle hLogger conf) botHandle hLogger (DataLoop x [] M.empty $ ts x)

loopBot :: Upd a => IO () -> Bot.Handle a -> SL.Handle -> DataLoop a -> IO ()
loopBot botInit botHandle hLogger dl = do
  putStrLn "1"
  putStrLn "1"
  botInit -- вычисление произойдёт здесь
  putStrLn "1"
  botInit -- вычисление произойдёт здесь
AKitavtsev commented 3 years ago

Конечно, погорячился IO () не от этого И когда произойдет вычисление, тоже догадывался. Но что такое (DataLoop x [] M.empty $ ts x) - не дошло. И как выйти достойно ,получив (DataLoop x [] M.empty $ ts x), совсем не понятно. Стараюсь это осознать

olegromashin commented 3 years ago

Но что такое (DataLoop x [] M.empty $ ts x) - не дошло. И как выйти достойно ,получив (DataLoop x [] M.empty $ ts x), совсем не понятно. Стараюсь это осознать

Это я просто скопировал запуск бота из initSession.

AKitavtsev commented 3 years ago

Дошло, наконец. Но, как стыдно, столько потратить чужого времени... Таких не берут в космонавты ):

Переделал ### (ветка issues13)

olegromashin commented 3 years ago

Ничего страшного, самое главное, что не зря сидели :)

AKitavtsev commented 3 years ago

Я предлагаю утвердить мою редакцию InitSession. Я много думал о testException и пришел к выводу, что она должна обходиться без InitSession. А InitSession необходима для другого случая - когда мы получаем респонс с ошибкой. но эта уже другая ситуация. и она почти решена. Предлагаю влить ветку Issue13, заодно 17 (там просто не о чем). Я открою новую ветку. И ее рамках закончу вопросы с InitSession и testException OK?

olegromashin commented 3 years ago

Ответил в ПРе :)