Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаленный вызов. детали, реализация, архитектура, у темы новое название! 
:(
    Опции темы
mes
Дата 25.11.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вас наверно путает отличие классического интерфейса от системы сообщений ?

ну с классическим все как бы понятно.. 
http://liveworkspace.org/code/1f1605eb39d1...9fd8e704db01c7f

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

для начала разгрузим через функции 
http://liveworkspace.org/code/1d220cb1240b...a2503e8f7cccc23

сразу видно неудобства.. нельзя передавать параметры.. да и вызов непохож...
плюс нет контроля целостности интерфейса (можно вызвать чужую функцию)

П.С. оператор, используем, так как оператор. не перегружаем..


следующий шаг это функторы :

http://liveworkspace.org/code/e2b08967aa19...441f61144050136

терь у нас появилась возможность передачи параметров и даже преимущество по отношению к методам - возможность отложенного вызова.. 
но пока у нас опять нет контроля целостности интерфейса..


Это сообщение отредактировал(а) mes - 25.11.2010, 23:47


--------------------
PM MAIL WWW   Вверх
mes
Дата 25.11.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот мы добились теперь целостности интерфейса :
  http://liveworkspace.org/code/f4279497086c...c0009551a5ec23e

но у нас есть недостаток, который был раньше и методов -  определение функции статично и определено зависимо от имени..

Добавлено через 11 минут и 24 секунды
вот  у нас независимость от того какой из хэндлеров реализует поведение функции :
http://liveworkspace.org/code/00d5dc2a7dc1...fffd4e435c48c85

вот внешне сохранив вид интерфейса, пришли к более удобной (для распределенного программирования) "технологии" событий.. 
 smile  




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.11.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  25.11.2010,  23:33 Найти цитируемый пост)
вас наверно путает отличие классического интерфейса от системы сообщений ?

это основное.

Цитата(mes @  25.11.2010,  23:53 Найти цитируемый пост)
но у нас есть недостаток, который был раньше и методов -  определение функции статично и определено зависимо от имени.. 

как-то двусмысленно smile 
PM WWW   Вверх
mes
Дата 26.11.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ну и самая мелочь.. так как точку нам пергрузить нельзя, а запятая не очень логична, то следует подобрать более подходящий оператор.. например << :
http://liveworkspace.org/code/25dea7a061ec...b1f94957a3d994e

Добавлено @ 00:12
Цитата(boostcoder @  25.11.2010,  23:07 Найти цитируемый пост)
как-то двусмысленно 

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

Добавлено @ 00:12
сейчас попробую более подходящие примеры подобрать..

Добавлено @ 00:14
вот например сортировка.. ясно что ей нужен предикат и какими требованиями он должен обладать.. 
наличие например в предикате вывода в консоль, это не предпологаемое поведение.. 
т.е в данном случае нам подходит классический делегат (колбяк)

Добавлено @ 00:16
а вот например дернул пользователь мышку.. кто именно будет обрабатывать эту ситуацию и как - неизвестно.. 
(имеется ввиду пользовательский уровень)..  тут подходит  - событие..

Добавлено через 12 минут и 13 секунд
если для делегата важно наличие некоего интерфейса, посредством которого, он будет выполнять желания объекта..
то в случае с событием, объект сам знает что ему делать, и смотрит лишь что произойдет (ждет события).. 



Это сообщение отредактировал(а) mes - 26.11.2010, 00:18


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.11.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот модель делегирования:
Код

//объект
typedef int (*callback) ();
void fn (callback cb) { std::cout << cb;}

//среда
int f1 () { return 5; }
int f2 () { return 6; }
fn( cond? f1 : f2);


Добавлено @ 00:30
это событийная модель :
Код

//объект
void fn (size_t id)
{
   static int i;
   switch (id) 
  {
          case 0 : std::cout << 1; break;
          case 1 : std::cout << "hallo";
          case 2 : std::cin >> i; break;
   }
}
//среда
fn(0);
fn(1);
fn(2);
fn(200);

среда не несет знаний о поведении...

Это сообщение отредактировал(а) mes - 26.11.2010, 00:32


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.11.2010, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ну вот например.. съимитируйте поведение через классические интерфейсы.. 
http://liveworkspace.org/code/9e5d8b87f078...257ff54be6cf0e4

Добавлено через 1 минуту и 25 секунд
при этом t1, t2 t3 могут быть разных типов, главное поддержка интерфейса smile


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.11.2010, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



соединение пусть пока так подключается  к другому (или само на себя) :
Код

   connection c1;
   connection c2;
   
   c1.send_to(c2);
   c2.send_to(c1);   


http://liveworkspace.org/code/d777ee9f6841...f5de734a9bc669a

Это сообщение отредактировал(а) mes - 26.11.2010, 02:08


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.11.2010, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вникаю..
PM WWW   Вверх
mes
Дата 26.11.2010, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.11.2010,  02:16 Найти цитируемый пост)
вникаю.. 

вот еще один пример,, как линейный набор вызовов отразить на иерархию любой глубины,
при этом с возможностью обработки одного вызова в нескольких местах :

http://liveworkspace.org/code/a6738364943c...3d3911a522284cf

fn - обработчик текущего уровня.. 
fw - передача на нижеследующий уровень..

Добавлено @ 10:17
Код

   _hb1.fn(m);
    _hb2.fn(m);
    _hb3.fn(m);  


это можно затуплить и форичить.. тогда составление иерархии можно будет автоматизировать..

Это сообщение отредактировал(а) mes - 26.11.2010, 10:42


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.11.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  26.11.2010,  09:14 Найти цитируемый пост)
это можно затуплить и форичить.. тогда составление иерархии можно будет автоматизировать..

примерно так :
http://liveworkspace.org/code/fa80f69f7186...337f4523435ac2e

Это сообщение отредактировал(а) mes - 26.11.2010, 10:44


--------------------
PM MAIL WWW   Вверх
mes
Дата 27.11.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



в последних примерах у нас соединение сильно перегруженное, имея зависимость от сендера и ресивера,
во первых сендер должен использовать соединение, а не быть использованным (как сейчас)
во вторых ресивер не должен быть содержимым, а должен пристыковываться.. и возможно не один.. 
в итоге соединение обретает такой вид:
Код

struct packet;

struct connection
{
   typedef std::function<void(packet const&)> receiver_t;  
   
   void send (packet const&);
   void bind_receiver (receiver_t rec)
   {
      _receiver = rec;
   }

 protected:
   virtual void  process_send (packet const& pack)
   {      
      receive (pack);
   }
   void receive (packet const& pack) { if (_receiver) _receiver (pack); }        
   
 private:
   receiver_t _receiver;
};

и тогда передача по сети будет
Код

struct tcp_connection : connection
{
   void connect (tcp_address const&);
   void disconnect ();
 protected:
   virtual void  process_send (packet const& pack)
   {      
      // отправка в сокет
   }
  ...
};


Это сообщение отредактировал(а) mes - 27.11.2010, 14:07


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 27.11.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



жесть какая, 43 страницы
вы когда закончите, напишите вкратце решение проблемы, а то всё читать долго =\
PM MAIL ICQ   Вверх
boostcoder
Дата 27.11.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, спасибо. я тут. не забил. работаю.
PM WWW   Вверх
mes
Дата 27.11.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  27.11.2010,  13:20 Найти цитируемый пост)
 я тут. не забил

я понимаю.. просто как появляется как идея сразу отмечаю smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 27.11.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(GoldFinch @  27.11.2010,  14:17 Найти цитируемый пост)
вы когда закончите, напишите вкратце решение проблемы

решение будет лежать тут: http://code.google.com/p/discoly/

Добавлено через 25 секунд
Цитата(mes @  27.11.2010,  14:23 Найти цитируемый пост)
как появляется как идея сразу отмечаю

еще раз спасибо.

Добавлено через 1 минуту и 49 секунд
Цитата(boostcoder @  27.11.2010,  14:23 Найти цитируемый пост)
решение будет лежать тут: http://code.google.com/p/discoly/

в принципе, сейчас там уже лежит рабочее решение. но у него есть очень существенный недостаток: реализации должны наследовать сгенеренные классы smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.