LyuPo7 / bot

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

Дублирование кода #10

Closed roman-bodavskiy closed 2 years ago

roman-bodavskiy commented 2 years ago

Вот яркий пример, функция makeRequest явно имеет одинаковую структуру для обоих ботов. Значит ее нужно вынести в общий код, а какие-то специфические куски оставить в соответствующих модулях https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Tele/Request/Requests.hs#L157 https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Vk/Request/Requests.hs#L222

Функции setHelpMessage и setStartMessage в Bot.Api.Tele.Request.Requests выглядят как абсолютно одинаковые. Функции withHandleIO для Bot.Api.Vk.Parser.Parser Bot.Api.Tele.Parser.Parser тоже одинаковые.

Во многих случаях можно вынести общую логику отдельно и избавиться от дублирования кода

LyuPo7 commented 2 years ago

Убрала дублирования

Вот яркий пример, функция makeRequest явно имеет одинаковую структуру для обоих ботов. Значит ее нужно вынести в общий код, а какие-то специфические куски оставить в соответствующих модулях https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Tele/Request/Requests.hs#L157 https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Vk/Request/Requests.hs#L222

Функции setHelpMessage и setStartMessage в Bot.Api.Tele.Request.Requests выглядят как абсолютно одинаковые. Функции withHandleIO для Bot.Api.Vk.Parser.Parser Bot.Api.Tele.Parser.Parser тоже одинаковые.

Во многих случаях можно вынести общую логику отдельно и избавиться от дублирования кода

roman-bodavskiy commented 2 years ago

еще довольно много мест, где можно убрать дублирование кода, вот например


      [b1, b2, b3, b4, b5] = buttons
      b1Tele = TeleButton.createButton
        (BotButton.text b1) (BotButton.description b1)
      b2Tele = TeleButton.createButton
        (BotButton.text b2) (BotButton.description b2)
      b3Tele = TeleButton.createButton
        (BotButton.text b3) (BotButton.description b3)
      b4Tele = TeleButton.createButton
        (BotButton.text b4) (BotButton.description b4)
      b5Tele = TeleButton.createButton
        (BotButton.text b5) (BotButton.description b5)
      keyboard = TeleKeyboard.createKeyboard
        [[b1Tele, b2Tele, b3Tele, b4Tele, b5Tele]]

явно можно переписать через fmap c какой-то вспомогательной функцией типа

createTeleButton button = TeleButton.createButton
        (BotButton.text button) (BotButton.description button)

но при этом, конечно не забывать проверку на корректность (что кнопок должно быть ровно пять)

roman-bodavskiy commented 2 years ago

Нужно внимательно просмотреть на предмет одинаковых кусков кода. Некоторые вещи в реализациях для Telegram и VK очень похожи, и общую логику можно вынести отдельно

LyuPo7 commented 2 years ago

Поменяла еще в паре мест. Теперь вроде бы только методы специфические для каждого из Api реализованы в Vk и Telegram

Нужно внимательно просмотреть на предмет одинаковых кусков кода. Некоторые вещи в реализациях для Telegram и VK очень похожи, и общую логику можно вынести отдельно

roman-bodavskiy commented 2 years ago

Screenshot from 2021-11-30 15-59-10

ну вот например практически одно и то же

KateBushueva commented 2 years ago

В этих двух модулях (Bot.Api.Tele.Mode.Mode и Bot.Api.Vk.Mode.Mode) довольно много одинакового кода, и есть набор функций, начиная с extractMessage и до changeUpdateId , которые обрабатывают один из видов апдейта и бросают ошибку на другом апдейте. По сути все эти пары функций можно объединить, обрабатывая сразу два варианта апдейта и обработки ошибок тогда там не потребуется.

Снимок экрана от 2021-12-01 09-44-17

При этом если возникает дублирование внутри функции, имеет смысл вынести общий код, например, в часть where

LyuPo7 commented 2 years ago

Объединила функционал этих двух модулей в Bot.Mode.Api

В этих двух модулях (Bot.Api.Tele.Mode.Mode и Bot.Api.Vk.Mode.Mode) довольно много одинакового кода, и есть набор функций, начиная с extractMessage и до changeUpdateId , которые обрабатывают один из видов апдейта и бросают ошибку на другом апдейте. По сути все эти пары функций можно объединить, обрабатывая сразу два варианта апдейта и обработки ошибок тогда там не потребуется.