Информация об изменениях

Сообщение Re: Какой дизайн паттерн использовать? от 15.07.2021 12:13

Изменено 15.07.2021 12:14 Умака Кумакаки

Re: Какой дизайн паттерн использовать?
Здравствуйте, k55, Вы писали:


k55>Простой вариант это иметь массив "variant"-ов (а-ля с труктура union с типов данных в ней) и передавать его в Callback.

для начала и так сойдёт, но в перспективе всё-таки захочется более сильного контроля над типами, поэтому я бы сделал так:
struct event_handler{
  virtual on_mouse_event(int x, int y) {};
  virtual on_file_system_event(file_desc f, e_file_event_data data) {}
  virtual on_network_event(socket s, socket_data d);
};

void loop() {
  if (event) 
    dispatch_dbus_event(event);
  }
}

void dispatch_dbus_event(event) {
  using std::for_each;
  switch (event.type) {
    case e_dbus_mouse: {
      const auto info = dbus_event_to_mouse_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_mouse_event(info.x, info.y) });
      break;
    } 
    case e_dbus_file_system: {
      const auto info = dbus_event_to_filesystem_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_file_system_event(info.f, info.data) });
      break;
    } 
    case e_dbus_network: {
      const auto info = dbus_event_to_network_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_network_event(info.socket, info.data) });
      break;
    } 
  }
}


Вместо виртуальных функций можно использовать std::function, будет чуть меньше связность, но меньше и сцепленность
Re: Какой дизайн паттерн использовать?
Здравствуйте, k55, Вы писали:


k55>Простой вариант это иметь массив "variant"-ов (а-ля с труктура union с типов данных в ней) и передавать его в Callback.

для начала и так сойдёт, но в перспективе всё-таки захочется более сильного контроля над типами, поэтому я бы сделал так:
struct event_handler{
  virtual on_mouse_event(int x, int y) {};
  virtual on_file_system_event(file_desc f, e_file_event_data data) {}
  virtual on_network_event(socket s, socket_data d) {};
};

void loop() {
  if (event) 
    dispatch_dbus_event(event);
  }
}

void dispatch_dbus_event(event) {
  using std::for_each;
  switch (event.type) {
    case e_dbus_mouse: {
      const auto info = dbus_event_to_mouse_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_mouse_event(info.x, info.y) });
      break;
    } 
    case e_dbus_file_system: {
      const auto info = dbus_event_to_filesystem_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_file_system_event(info.f, info.data) });
      break;
    } 
    case e_dbus_network: {
      const auto info = dbus_event_to_network_info(event);
      for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_network_event(info.socket, info.data) });
      break;
    } 
  }
}


Вместо виртуальных функций можно использовать std::function, будет чуть меньше связность, но меньше и сцепленность