2010-10-07 2 views
0

Я проектирую сервер, который используется в UDP-связи с использованием MFC. У меня есть следующие классыЯвляется ли мой дизайн для сервера сокетов UDP правильным?

  • CMyDlialog - Берегите интерфейс пользователя
  • CController - Закон как посредник между всеми классами
  • CProtocolManager - Позаботьтесь о кодировании/декодировании сбщи (Это статический класс)
  • CConnectionManager - Береги UDP соединения, передачи, приема

я создаю объект CConnectionManager в качестве переменной-члена в CController и объекта CController как переменная члена в CMyDialog.

Когда пользователь вводит что-то и нажимает send, я вызываю метод в CControler, который вызовет метод в CProtocolManager для создания пакета и вызовет метод CConnectionManager для его отправки.

Когда я получаю некоторые данные, он обрабатывается в потоке CConnectionManager. Там я создаю локальный объект CController и вызываю метод, который передаст данные в CProtocolManager для декодирования.

Теперь я хочу сообщить пользовательскому интерфейсу о данных, как это сделать CControler? я могу опубликовать сообщение в пользовательском интерфейсе, сделав основной дескриптор диалога глобальным, это правильный подход.

Также скажите, правильна ли эта конструкция.

Заранее благодарен

ответ

0

Я думаю, что проекты никогда не правильные или неправильные, но вы можете оценить их в соответствии с некоторыми принципами, которые многие считают «хорошими» (см. the SOLID principles).

Ваш подход к отправке звучит разумно, но сделать Dialog глобальным для приема определенно считается «не очень хорошим». См. the hollywood principle. Я предлагаю вам лучше передать метод обратного вызова вашему диспетчеру соединений, который является методом CController (который затем позволяет CProtocolManager декодировать его и вызывать другой метод обратного вызова из диалога). Если обратные вызовы не то, что вы хотите, вы можете определить AbstractBaseClasses (ABC), как этот «AbstractMessageReceiver» с методом

virtual void receive(const char*, int length) = 0; 

Вы можете осуществить это ABC в CProtocolManager передать это как «AbstractMessageReceiver *» к CConnectionManager который затем вызывает

m_myMessageReceiver->receive(m_buffer, m_length); 

или что-то подобное.

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

Кроме того, я согласен с тем, что вы должны подумать о своей модели резьбы!

+0

Итак, я должен передать AbstractMessageReceiver * функции потока, которая получает данные и передает это контроллеру, который вызовет фактический метод получения? – Jeeva

+0

, вы можете это сделать, но мне интересно, нужно ли вам создавать локальный контроллер или просто передать существующий контроллер диспетчеру соединений? Затем вы можете передать AbstractMessageReceiver контроллеру, и диспетчер соединений не должен беспокоиться об этом. – Philipp

0

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

+0

На самом деле я слушаю подключения и обрабатываю запрос в другом потоке, который генерируется CConnectionManager. – Jeeva

Смежные вопросы