Проблема разработки протокола сокета C ++ (включение кольца) - PullRequest
0 голосов
/ 02 мая 2010

Итак, у меня есть эти два класса, mpqs_client и client_protocol. Класс mpqs_client обрабатывает подключение сокета Boost к серверу (отправляя и получая сообщения в определенном формате. При получении сообщения он вызывает статический метод parse_message (..) в классе client_protocol, и этот метод должен анализировать сообщение Получите и выполните соответствующее действие.

Учитывая некоторые специфические данные, метод parse_message должен отправить некоторые данные обратно на сервер. Как уже упоминалось, это происходит через класс mpqs_client. Таким образом, я мог бы из mpqs_client передать this в parse_message (..) в client_protocol. Однако это приводит к двусторонней связи между двумя классами. То, что я считаю, нежелательно. Кроме того, чтобы реализовать это, мне нужно было бы включить другого в каждый из них, и это доставляет мне ужасную боль.

Я думаю, что это больше проблема дизайна. Какое лучшее решение здесь?

Код размещен ниже.

Класс mpqs_client:

#include "mpqs_client.h"

mpqs_client::mpqs_client(boost::asio::io_service& io_service, tcp::resolver::iterator endpoint_iterator) : io_service_(io_service), socket_(io_service) {
    ...
}
...
void mpqs_client::write(const network_message& msg) {
    io_service_.post(boost::bind(&mpqs_client::do_write, this, msg));
}

Класс client_protocol:

#include "../network_message.hpp"
#include "../protocol_consts.h"

class client_protocol {
public:
    static void parse_message(network_message& msg, mpqs_sieve **instance_, mpqs_client &client_) { 
        ...                 
        switch (type) {         
            case MPQS_DATA: 
                ...         
                break;
            case POLYNOMIAL_DATA:
                ...
                break;
            default:
                break;
        }
    }

1 Ответ

0 голосов
/ 03 мая 2010

Извлеките интерфейс (абстрактный базовый вызов в C ++) для mpqs_client и передайте его экземпляр в client_protocol - экземпляр фактически является реальным объектом mpqs_client, но интерфейс избегает двунаправленной зависимости.

...