私はC++で大規模なソフトウェア開発をするのが初めてで、デザイン面で疑問に思っていました。
私は この質問 を読んでいましたが、全体として、定数の定義やその他の些細な問題を乗り越えたら、C++ヘッダーファイルは単なるAPIの定義です:
それらは、他のプログラマー(または他のモジュールの自分)が使用できるもの(クラス、パブリック関数)を定義しますが、プライベートクラスまたは関数を定義することはできません。それは、ヘッダーファイルが抽象化(インターフェイス...)を定義し、ソースファイルがそれを実装するようなものです。ソースファイルがコンパイルされると、実装の詳細は隠され、モジュールが実行できることを定義する公開されているヘッダーが残ります。
「XXX
は公開されているAPI素材になるか、それともソーセージを作る詳細なのか」と考えることができるので、このヘッダー/ソースファイルの分離の見方は、通常の説明よりも理解しやすく、理解しやすいと感じました。公開されていないソースファイルに隠されますか?」
ヘッダーファイルのメンタルモデルはおおよそ正しいですか?私は何を取りこぼしたか ?
ガイドとして使用することは悪いメンタルモデルではありませんが、残念なことに、歴史的/技術的な理由により、C++ヘッダーはこの単純なメンタルモデルでは完全にキャプチャされない方法でインターフェイスと実装を統合します。
物事が少し複雑になったときに物理的な設計を適切に決定するには、C++でのヘッダーの動作をより詳細なレベルで理解する必要があります。
例を挙げると、APIビューから、ヘッダーファイルにプライベート実装クラスの定義を含めないでください。ただし、実際には、このようなクラス定義はヘッダーファイルに含まれることがよくあります。これは、パブリッククラスに含まれている場合、コンパイラーがそれらのサイズを知る必要があるためです。この種の依存関係を解消する手法は存在しますが、一般に、コードの複雑さ、パフォーマンス、またはその両方の点でコストがかかります。これらの手法の1つを使用するのが適切な場合を理解するには、C++でのヘッダーの動作をより深く理解する必要があります。
主な部分で他の言語で使用されているヘッダーファイルとインターフェイスの違いはほとんどありません。ヘッダーにはプライベート情報も含まれるという点で実装には違いがありますが、基本的には、クラスまたはモジュールが提供する機能を説明するために使用されます。
ある意味では、APIと組み合わされたデータ構造のメンタルモデルでもあるので、記述した種類の初期設計を行っているときに、それはより役立つ可能性があります。
理想的には、APIを定義するヘッダーには純粋なインターフェースのみが含まれますが、C++にはABIがないため、これは重要ではありません。純粋なクライアントインターフェイスを提供する上位レベルのシステムを構築する場合は、IDLやWSDLなどの別のメカニズムを使用してそれを定義します。