web-dev-qa-db-ja.com

静的ライブラリでのヘッダーの分割と非表示

C/C++(個人プロジェクト)の静的ライブラリを書いています。ヘッダーがかなり大きくなると、ヘッダーを分割することをお勧めします。

現在、ヘッダーは次のようになっています。

  • MainClass.hpp

    • 名前空間の実装:名前空間に囲まれた実装の詳細impl
    • 以下で宣言されたクラスの前方宣言(必要な場合)

    • MainClass宣言
    • MainClass無料の関数宣言
    • MainClass特殊化宣言
    • MainClass特殊化のない関数宣言
    • AuxiliaryClass1宣言
    • AuxiliaryClass1無料の関数宣言
    • AuxiliaryClassN宣言
    • AuxiliaryClassN無料の関数宣言

    • MainClass定義
    • MainClass無料の関数定義
    • MainClass特殊化定義
    • MainClass特殊化フリー関数定義
    • AuxiliaryClass1定義
    • AuxiliaryClass1無料の関数定義
    • AuxiliaryClassN定義
    • AuxiliaryClassN無料の関数定義

どこ:

これは非常に込み入っており、ナビゲートするのが困難になっているので、複数のヘッダーに分割すると役立つと思いました。しかし、私はそれを正しく行う方法を知りません。

構造は次のようになると思います。

  • MainClass.hpp

    • フォワード宣言(必要な場合)
    • 小さなクラス/構造体の定義と宣言
    • #includeその他のヘッダー
  • _ Class.hpp

    • _Class宣言
    • _Class無料の関数宣言
  • _ Class.inl
    • _Class定義
    • _Class無料の関数定義

それぞれに_Classがあります:MainClassMainClass特殊化、AuxiliaryClassK

私の質問は:

  • ヘッダーを分割するのは理にかなっていますか(すべてMainClassの機能です)(ヘッダーは1000行を超えており、さらに長いヘッダーがあると予測しています)、それともそのままにしておくべきですか?
  • 上記の分割スキームは大丈夫ですか?クラスとそのクラスに関連する無料の関数をさらに分割する必要がありますか?コードをより保守しやすくする他の解決策はありますか?
  • 他のヘッダーを非表示にする方法(コードを難読化/使用不可にするのではなく、ユーザーに表示されるヘッダーを公開しないようにする方法(オートコンプリート付きのGUIなど))には、MainClass.hppのみを含めて認識させる必要があります。他のヘッダーが背後にあることを明確にせずに表示すると、不要な混乱が生じます。1つのアイデアは、_(アンダースコア)のような接頭辞を追加するか、implフォルダーに配置することです。(ここでも、これはクラスを非表示にすることではありません(名前空間を使用して行います)が、使用するヘッダーの後ろに分割を隠すためです)。
2
bolov

次のことができます。

  • コードをヘッダーファイルごとに1つのクラスに分割します。

  • テンプレートの場合、クラス関数の実装は同じヘッダーファイルに常駐することができます(存在する必要があります(ヘッダーをインクルードする必要があるシナリオはありませんが、それらの定義はありません)。

  • 依存関係(AuxiliaryClassK)は#included直接定義する代わりに。これにより、ヘッダーが小さくなり、コードの再利用が促進され(他の場所にヘッダーを含めることができるため、ヘッダーのみを含めることができます)、コードがよりクリーンになります。

  • コードをディレクトリに分割します。ディレクトリ構造は通常、ポリシーの問題です。 implフォルダーのアイデアを使用することも、(たとえば)boostのようにそれらをグループ化することもできます(すべての実装ファイルを含む機能領域ごとに1つのディレクトリ、および便宜上1つのインクルードファイル)。クライアントコードの1行に含めることができます。 )。

  • コンパイル時間を最小限に抑えるためにpimplイディオムを使用します。

原則として、_Classファイル名は使用しません。それらは異常です(決して良くないコードのWTF/LOC測定を増やします)。

1
utnapistim