Предыстория: я помогаю разрабатывать многопользовательскую игру, написанную в основном на C++, в которой используется стандартная архитектура клиент-сервер. Сервер может быть скомпилирован сам по себе, а клиент скомпилирован с сервером, поэтому вы можете размещать игры.
Проблема
Игра объединяет клиентский и серверный код в одни и те же классы, и это становится очень громоздким.
Например, ниже приведен небольшой пример того, что вы можете увидеть в обычном классе:
// Server + client
Point Ship::calcPosition()
{
// Do position calculations; actual (server) and predictive (client)
}
// Server only
void Ship::explode()
{
// Communicate to the client that this ship has died
}
// Client only
#ifndef SERVER_ONLY
void Ship::renderExplosion()
{
// Renders explosion graphics and sound effects
}
#endif
И заголовок:
class Ship
{
// Server + client
Point calcPosition();
// Server only
void explode();
// Client only
#ifndef SERVER_ONLY
void renderExplosion();
#endif
}
Как видите, при компиляции только сервера определения препроцессора используются для исключения графического и звукового кода (что выглядит некрасиво).
Вопрос:
Каковы некоторые из лучших практик для организации и очистки кода в архитектуре клиент-сервер?
Спасибо!
Изменить: примеры проектов с открытым исходным кодом, в которых используется хорошая организация, также приветствуются :)