DenDragonB / echobot

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

Мутабельный хендл #3

Closed delfigamer closed 3 years ago

delfigamer commented 3 years ago

https://github.com/DenDragonB/echobot/blob/eab9a733042a38d49c7f2a17892d7791c6c5b244/src/Bot.hs#L25-L29

При обычном использовании хендл-паттерна, сам по себе хендл - это иммутабельный объект, который передаётся в функции на манер ридера. Если требуется хранить переменное состояние, то это можно решить такими методами:

  1. Хранить в хендле мутабельную ссылку - STRef, IORef, TVar.
  2. Сделать хендл параметризованным по монаде и хранить в нём функцию-аксессор и функцию-мутатор состояния:
    data Handle m = Handle
     { config :: Config
     , getUsers :: m [Users]
     , updateUsers :: ([Users] -> [Users]) -> m ()
     }

    С другой стороны, если хочется оставить как есть - это тоже имеет право на жизнь; однако, в таком случае, для этой структуры более верным названием будет State - оно более точно передаст её назначение, и не будет сбивать с толку неверными ассоциациями с классическим хендл-паттерном.

DenDragonB commented 3 years ago

разделил