特に、インターフェイス、コンポーネントの公開面、およびその背後にある実装をより適切に分離したいと考えています。
あなたが探しているのはFacadeパターンだと思います:
ファサードは、クラス ライブラリなどのより大きなコード本体への単純化されたインターフェイスを提供するオブジェクトです。-- ウィキペディア
クラスに複雑な相互作用がある場合は、MediatorとBuilderのパターンを確認することもできます。
Pimplのイディオム (別名コンパイラ ファイアウォール) は、実装の詳細を隠してビルド時間を短縮するのにも役立ちます。ポリモーフィズムが必要ない場合は、インターフェイス クラス + ファクトリよりも Pimpl を使用することを好みます。ただし使いすぎには注意。通常はスタックに割り当てられる軽量型 (3D ポイントや複素数など) には Pimpl を使用しないでください。ユーザーから隠したい他のクラス/ライブラリに依存する、より大きくて長寿命のクラスに使用します。
大規模なプロジェクトでは、単純な前方宣言で十分な場合は、ヘッダー ファイルで #include ディレクティブを使用しないことが重要です。絶対に必要な場合にのみ、ヘッダー ファイルに #include ディレクティブを配置します (実装ファイルに #include を配置することをお勧めします)。正しく行われれば、適切な #include 規律により、コンパイル時間が大幅に短縮されます。Pimpl のイディオムは、#includes をヘッダー ファイルから対応する実装ファイルに移動するのに役立ちます。
クラス/関数の首尾一貫したコレクションを独自の名前空間にまとめて、ソース ツリーのサブディレクトリに配置できます (サブディレクトリは、ライブラリの名前空間と同じ名前にする必要があります)。次に、そのパッケージの静的ライブラリ サブプロジェクト/makefile を作成し、それをメイン アプリケーションにリンクできます。これは、UML 用語で「パッケージ」と見なすものです。理想的なパッケージでは、クラスは互いに密接に関連していますが、パッケージ外のクラスとは緩やかに関連しています。パッケージの依存関係図を作成して、循環的な依存関係がないことを確認すると便利です。