バックグラウンド: 私は、標準的なクライアント サーバー アーキテクチャを使用する、ほとんどが 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
}
ご覧のとおり、サーバーのみをコンパイルする場合、プリプロセッサ定義を使用してグラフィックとサウンド コードを除外します (これは醜いように見えます)。
質問:
クライアント/サーバー アーキテクチャのコードを整理してクリーンに保つためのベスト プラクティスにはどのようなものがありますか?
ありがとう!
編集:優れた組織を使用するオープン ソース プロジェクトの例も歓迎します :)