Это не столько технический вопрос, сколько вопрос дизайна С++.
Часто мне кажется, что мне приходится разрабатывать программы, которые должны управлять некоторым протоколом, который имеет какое-то соединение, этап синтаксического анализа и абстрактный вид. Обычно я стараюсь разрабатывать свои программы с разделением проблем на переднем плане.
Я продолжаю концы с "стеками" объектов, система сидит на столе синтаксического анализатора, который по очереди сидит на вершине соединения (часто есть больше слоев). Затем эти объекты используют вызовы функций-членов для вызова слоя под ним (Tx) и используют обратные вызовы (std::function
, обычно) для захвата информации, поступающей из других направлений (Rx).
Этот дизайн кажется действительно подпарам, так как он добавляет сложности, и каждый уровень должен иметь постепенно увеличивающийся конструктор и так далее. Кроме того, поскольку соединение обычно использует что-то вроде ASIO, обратные вызовы обычно выполняются на разных потоках, поэтому трудно рассуждать о безопасности потоков.
Существует ли проектный паттерм или идиома, которые лучше всего представляют эту структуру/функциональность?
ИЗМЕНИТЬ
Простой пример
class basic_connection {
basic_connection(std::string address);
void send(std::string);
std::function<void(std::string)> on_receive;
};
У меня есть несколько классов, подобных этому, которые сохраняют это состояние слоя и склеиваются вместе с их публичными функциями-членами и обратными вызовами.
Уровень выше этого, принимает процессы обработки команд для сети и вызывает basic_connection::send
. И берет необработанные данные из basic_connection
и преобразуется в команды для слоя над ним, который не обрабатывается.
EDIT2:
Еще одна проблема, о которой я забыл упомянуть, заключается в том, что вы в конечном итоге перенаправляете какой-то интерфейс, хотя стек, например, на верхнем уровне, все еще должен знать статус соединения.