Допустимо ли использование mutable для IO? - PullRequest
0 голосов
/ 15 июня 2019

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

Это нормально для событий мыши и событий клавиш;однако для событий рисования я не могу сохранить постоянство, потому что события рисования по своей природе видоизменяют любой графический контекст, на котором они рисуются.

В этом примере я хотел бы создать изменяемый графический контекст, чтобы само событиеостается постоянным.Я осознаю опасность мутабельности, поэтому я хотел бы услышать причины против изменчивости и альтернатив, если это неприемлемо.

Для полноты, вот пример моего кода, иллюстрирующий проблему:

namespace event {
  struct Mouse {
    struct Interface {
      virtual ~Interface() = 0;

      virtual void on_l_press(const Mouse&) {}
      virtual void on_l_release(const Mouse&) {}
      virtual void on_l_click(const Mouse&) {}
      virtual void on_l_drag(const Mouse&) {}

      virtual void on_m_press(const Mouse&) {}
      virtual void on_m_releas(const Mouse&) {}
      virtual void on_m_click(const Mouse&) {}
      virtual void on_m_drag(const Mouse&) {}

      virtual void on_r_press(const Mouse&) {}
      virtual void on_r_release(const Mouse&) {}
      virtual void on_r_click(const Mouse&) {}
      virtual void on_r_drag(const Mouse&) {}

      virtual void on_move(const Mouse&) {}
      virtual void on_enter(const Mouse&) {}
      virtual void on_exit(const Mouse&) {}
    };

    gmt::Point<float> point = { -1, -1 };
  };

  struct Paint {
    struct Interface {
      virtual ~Interface() = 0;

      virtual void on_paint(const Paint&) {}
    };

    gmt::Rect<float> dirty;
    mutable gfx::Context context;
  };
}

Я слышал о IO Monads в Haskell, но, к сожалению, у меня нет большого опыта или понимания с ними.

Также в качестве небольшой заметки я понимаю, что события должны бытьзанятия с геттерами и сеттерами.Это то, что я планирую изменить, когда у меня появится лучшее представление о завершении событий.

...