Re: подскажите по дизайну
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.02.14 15:31
Оценка:
наверное я слишком сложно все описал, попробую псевдокодом.

сейчас оно вот так:
// сгенерированный инвокер
template<typename IO, typename Impl>
struct invoker {
   invoker(IO &io, Impl &impl)
      :io(io)
      ,impl(impl)
   {}

   // этот метод генерируется всегда, и, собственно он и производит инвокинг
   void invoke(const char *ptr, const std::size_t size) {/* внутренности сейчас не интересуют */}

   // эти методы генерируются по просьбе юзера
   void ping() {}
   void stat() {}

private:
   IO &io;
   Impl &impl;
};

// сессия
struct session_base {
   session_base(boost::asio::io_service &ios) {}
   // при чтении данных вызывается этот метод
   virtual void on_received(const char *ptr, const std::size_t size) = 0;
};

// user_context описываемый пользователем
struct user_context: session_base, invoker {
   user_context(boost::asio::io_service &ios)
      :session_base(ios)
      ,invoker<user_context>(*this, *this)
   {}

   // к примеру, этот метод зовется по таймеру
   void timeout() {
      // тут мы зовем удаленные процедуры, которые были сгенерированы в инвокере.
      ping();
      stat();
      // ниже приведены процедуры которые вызываются в ответ
   }

   // сгенерированный инвокер рассчитывает на то, что у нас есть
   // такие процедуры, которые вызываются противоположной стороной:
   void on_ping(const std::string &msg) {}
   void on_stat(const std::vector<some type> &stat) {}

private:
   // при чтении данных вызывается этот метод - реализация
   void on_received(const char *ptr, const std::size_t size) {
      // вызываем invoke() нашего инвокера
      invoke(ptr, size);
   }
};

т.е. тут все просто, локальные данные user_context`а юзер вписывает в сам user_context. а вызов удаленных процедур прост потому, что user_context наследует инвокер в котором и сгенерены вызывающие методы, и session_base в котором и живет сокет.


теперь я хочу чтоб инвокер существовал в единственном экземпляре.
это создаст проблему: в обрабатываемую процедуру нужно передавать и сам user_context для оперирования данными юзера, и session_base чтоб отправить данные противоположной стороне.

а вот и три вопроса, из топика:
1. имеет ли смысл такая переделка?
2. есть ли предложения о том, что нужно сделать, чтоб сигнатуры процедур соответствовали описанным юзером(т.е. чтоб не поставлять дополнительные аргументы)?
3. если таки придется изменять сигнатуры процедур, делать ли это скрытно от пользователя, или заставить его вписывать эти дополнительные аргументы?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.