私はコードを整理するのが大好きなので、理想的にはファイルごとに1つのクラスが必要です。メンバー以外の関数がある場合は、ファイルごとに1つの関数が必要です。
理由は次のとおりです。
コードを読むと、特定の関数またはクラスを見つける必要があるファイルが常にわかります。
ヘッダーファイルごとに1つのクラスまたは1つの非メンバー関数である場合
include
、ヘッダーファイルのときに混乱全体をインクルードすることはありません。関数に小さな変更を加えると、その関数だけを再コンパイルする必要があります。
ただし、すべてを多くのヘッダーと多くの実装ファイルに分割すると、コンパイルが大幅に遅くなる可能性があります。私のプロジェクトでは、ほとんどの関数が特定の数のテンプレート化された他のライブラリ関数にアクセスします。そのため、コードは実装ファイルごとに1回ずつ、何度もコンパイルされます。プロジェクト全体のコンパイルには、現在1台のマシンで45分ほどかかります。約50個のオブジェクトファイルがあり、それぞれが同じコンパイルコストの高いヘッダーを使用します。
たぶん、ヘッダーファイルごとに1つのクラス(または非メンバー関数)を持つことは許容されますが、次の例のように、これらの関数の多くまたはすべての実装を1つの実装ファイルに入れますか?
// foo.h
void foo(int n);
// bar.h
void bar(double d);
// foobar.cpp
#include <vector>
void foo(int n) { std::vector<int> v; ... }
void bar(double d) { std::vector<int> w; ... }
繰り返しになりますが、foo関数のみまたはbar関数のみを含めることができ、1つのファイルであるため、foobar.cpp
プロジェクト全体のコンパイルが高速になるという利点があります。テンプレート化された構造をコンパイルする)をコンパイルする必要があるのは1回だけですが、とを別々にコンパイルした場合は2回コンパイルする必要があります。もちろん、上記の私の理由(3)は、このシナリオには当てはまりません。foo(){...}を変更した後、大きな可能性のあるファイル全体を再コンパイルする必要があります。std::vector<int>
foo.cpp
bar.cpp
foobar.cpp
私はあなたの意見が何であるか興味があります!