C ++ヘッダーファイルの設計:APIの定義と同じですか?


8

私はC ++で大規模なソフトウェア開発をするのが初めてで、デザインの側面について疑問に思っていました。

私はこの質問を読んでいて、全体として、定数の定義やその他の些細な問題を乗り越えたら、C ++ヘッダーファイルは単なるAPI定義だと思いました。

それらは、他のプログラマー(または他のモジュールからの自分)が使用できるもの(クラス、パブリック関数)を定義しますが、プライベートクラスまたは関数を定義することはできません。それは、ヘッダーファイルが抽象化(インターフェイス...)を定義し、ソースファイルがそれを実装するようなものです。ソースファイルがコンパイルされると、実装の詳細は隠され、モジュールが実行できることを定義する公開されているヘッダーが残ります。

ヘッダーとソースファイルの分離に関するこの見方は、通常の説明よりもはるかに理解しやすく、理解しやすいと感じXXXました。未公開のソースファイル?」

ヘッダーファイルのメンタルモデルはおおよそ正しいですか?私は何を取りこぼしたか ?


また、ソフトウェアの設計を支援するために作成されたシステムのUMLも確認してください。そのクラスは、APIのメソッドとデータ(属性)をクラス図に表示します
gbjbaanb

私を信じて、私はUMLについて知っています!= pこれはC ++の考え方であり、頭を抱え込むのに苦労しています。私は「Pythonの世界から来た」ので、「なぜ言語にヘッダーファイルが必要なのでしょうか?」=)
Jiby

回答:


10

ガイドとして使用することは悪いメンタルモデルではありませんが、残念なことに、歴史的/技術的な理由により、C ++ヘッダーはこの単純なメンタルモデルでは完全にキャプチャされない方法でインターフェイスと実装を統合します。

物事が少し複雑になったときに物理的な設計を適切に決定するには、C ++でヘッダーがどのように機能するかをより詳細なレベルで理解する必要があります。

例を挙げます:APIビューから、ヘッダーファイルにプライベート実装クラスの定義を含めないでください。ただし実際には、このようなクラス定義は多くの場合ヘッダーファイルに表示されます。これは、パブリッククラスに含まれている場合、コンパイラーがそれらのサイズを知る必要があるためです。この種の依存関係を解消する手法は存在しますが、一般に、コードの複雑さ、パフォーマンス、またはその両方の点でコストがかかります。これらの手法のいずれかを使用するのが適切である場合を理解するには、C ++でのヘッダーの動作を深く理解する必要があります。


私はプライベートクラスの前方定義について考えていました。別の「隠し」ヘッダーファイルにそれらを入れてインクルードすることで、不正行為を回避できますか?このようにして、「プレーンなAPIヘッダー」と「ダーティープライベートトリック」を保持します。それでも多くのことがうまくいくかどうかはわかりません。
Jiby

@Jiby個別の「詳細」ヘッダーは、プライベート実装の詳細を分割するための非常に一般的な方法です。そのため、これは優れたアプローチです。ネストされたdetail名前空間に実装の詳細を配置することも非常に一般的です。これにより、メインライブラリの名前空間を汚染せず、直接使用するためのものではないことを明確にします。
mattnewport 2015

3

主な部分で他の言語で使用されているヘッダーファイルとインターフェイスの違いはほとんどありません。ヘッダーにはプライベート情報も含まれるという点で実装には違いがありますが、基本的にはクラスまたはモジュールが提供する機能を説明するために使用されます。

そうすると、APIと組み合わされたデータ構造のメンタルモデルでもあるので、説明するような初期設計を行っているときに、それはより役立つ可能性があります。

理想的には、APIを定義するヘッダーには純粋なインターフェースのみが含まれますが、C ++にはABIがないため、これは重要ではありません。純粋なクライアントインターフェイスを提供する上位レベルのシステムを構築する場合は、IDLやWSDLなどの別のメカニズムを使用してそれを定義します。



-1

純粋なインターフェイスとしてのヘッダーファイルは、クラスで多かれ少なかれ正常に機能します。テンプレートが登場するとすぐに、このモデルはまったく機能しなくなります。テンプレートはコンパイルできません。テンプレートの実装全体がヘッダーに含まれている必要があります。


別のヘッダーにテンプレート関連のコードを記述し、それを含めることで、ごまかすことはできますか?
Jiby
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.