gKrokod / botReborn

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

Мелкие замечания по коду #6

Closed roman-bodavskiy closed 1 week ago

roman-bodavskiy commented 3 weeks ago
  1. функция makeMessage продублирована
makeMessage :: Data T.Text DataFromButton -> Message -> Message
makeMessage (Msg t) msg = case t of
  "/help" -> msg {mData = Command "/help"}
  "/start" -> msg {mData = Command "/help"}
  "/repeat" -> msg {mData = Command "/repeat"}
  _ -> msg
makeMessage _ msg = msg

makeMessage :: String -> Message -> Message
makeMessage t msg = case t of
  "/help" -> msg {mData = Command "/help"}
  "/start" -> msg {mData = Command "/help"}
  "/repeat" -> msg {mData = Command "/repeat"}
  _ -> msg {mData = Msg $ T.pack t}
  1. кстати раз у нас всего два возможных значения для Command, то можно создать перечисление

data Command = Help | Repeat

  1. этот тип обязательно должен быть полиморфным? эта полиморфность где-то используется? data Data t i = Msg t | Gif t | Command t | KeyboardMenu | Query i deriving (Show, Eq)

  2. не очень нравится это дефолтное значение

    defaultMessage :: Message
    defaultMessage = Message {mID = ID (-1), mUser = User (-1), mData = Msg "fake message for -Wall and -Werror"}

    Лучше использовать Nothing чем такие странные дефолтные значения как Msg "fake message for -Wall and -Werror", так как мы можем считать что у нас есть сообщение, но по факту его нет

  3. base <- takeMVar m
    putMVar m base

    по моему здесь можно использовать readMVar

  4.     [ [ Button {text = "1", callback_data = "1"},
            Button {text = "2", callback_data = "2"},
            Button {text = "3", callback_data = "3"},
            Button {text = "4", callback_data = "4"},
            Button {text = "5", callback_data = "5"}
          ]
        ]

    здесь можно упростить с помощью map

isCorrectRepeatCount :: Message -> Bool
isCorrectRepeatCount m = case mData m of
  Msg t -> checkText $ T.unpack t
  Query i -> helper i
  _ -> False
  where
    helper :: DataFromButton -> Bool
    helper (DataFromButton d) = d `elem` [1 .. 5]
    checkText :: String -> Bool
    checkText [h] = h `elem` ("12345" :: String)
    checkText _ = False

странно, почему у тебя число повторов может быть как числом так и текстом?

  1. опечатка в Readme Regularly reuest a new message
gKrokod commented 2 weeks ago
  1. Это внутренние функции в разных модулях, которые их не экспортируются. Надо создать новый модуль, поместить туда общую для них функцию и импортировать ее из других модулей вместо них?
  2. Полиморфность не используется сейчас, сделал для возможного расширения в будущем, когда в сообщении могут быть данные, которые удобней представить иным типом.
  3. Установить новое значение повторов можно либо написав текст (Text), либо в версии телеграм нажав кнопку (DataFromButton). Обработчик один на оба случая.
roman-bodavskiy commented 2 weeks ago

1 Да можно так, если в коде есть еще повторяющиеся фрагменты, можно поместить их туда 2 Ок пусть будет, но вообще заранее обобщать не надо 3 Хорошо, понял