ファイルに分割-どのくらいの分割ですか?


9

私が言うなら、コンポーネントモデルではなく、階層的なエンティティフレームワークがあります。のようなもの:(
はい、これは構成されています)

武器->銃->自動銃-> MP44
または、より古典的な例:
Entity-> MovableEntity-> Enemy-> WalkingEnemy

読みやすさと整理のために、ソースファイルとヘッダーファイルをどのくらい分けますか?Entity.cpp、MovableEntity.cpp、Enemy.cppなどのようにするのが最善ですか、それともEntity.cpp [EntityとMovableEntityを含む]やEnemy.cpp [EnemyとWalkingEnemyを含む]などのアプローチの方が良いでしょうか。(または、より言語にとらわれない方法で、EnemyファイルとEntityファイルではなく、各クラスのファイルですか?)
また、これは可読性と編成以外に影響しますか?


1
Nitpicky language-agnosticですが、副作用については使用している言語に大きく依存するため、適切なタグではないと思います。
Tetrad 2010

良い点は、タグを付け直すことができると思います。
共産主義者のダック

回答:


12

これは完全に好みの問題です。ただし、個人的には、ファイルを増やすことをお勧めします。Javaでは、ファイルごとに1つのクラスが必要です。たとえば、ファイル名はクラス名と同じです。彼らはポリシーによってこれを行い、この良い習慣を実施します(ただし、基本的にこれを回避するサブクラスを持つことができます)。

また、ソースコントロールシステムは、ファイル内の変更をマージするのに優れていますが、完全に別のファイルで作業している場合は、それほど面倒ではありません。また、誰がどのクラスを変更したかを簡単に確認できます。別の開発者がAllEntities.hファイルを変更するとします。ファイルを開いてdiff出力を確認するまで、彼が変更したエンティティを正確に知る手掛かりはありません。

ただし、クラスに関連する小さな構造体と列挙型を1つのクラスのファイル内グループ化すると便利です。単一のクラスでのみ使用される列挙型がある場合、それを独自のファイルに分割するのはなぜですか?組み合わせるだけです。しかし、それが別のクラスで使用されている場合(つまり、別のクラスメンバーがこの列挙型である場合)は、独自のファイルを与えるときです。


同意した。あなたのタイプの複雑さは間違いなく要因です。言語が部分クラスをサポートしている場合(またはメンバーの実装をC ++と同様に編成できる場合)、特に複雑な型を複数のファイルに分割することをお勧めします。たとえば、クラスが実装する必要がある(大きな)インターフェイスがあるが、コードがかなり一般的で、他のコードとあまり関係がない場合、そのコードを別のファイル/部分クラスに分割できます。列挙型の場合、特定の名前空間のすべての列挙型を1つのファイル内に配置することで問題がなくなると思います。
Mike Strobel

1
列挙型をグループ化すると、単一の値を変更すると、その名前空間で列挙型を使用するすべてのファイルが再コンパイルされることになりますか?
共産主義者のダック

まあ、それは本当に言語に依存しますが、はい、確かにそれはその効果を持つことができます。私は主にC#(ファイルごとのコンパイルなし)で開発しているため、実際には問題ではありませんが、C ++や他の言語では問題が発生する可能性があります。いつものように、考慮すべき言語固有の要素があり、それはそれらの1つです:)。
Mike Strobel、2010

2

C / C ++以外の多くの言語は、ファイルに制約を課しています。リケットは、Javaの「ファイルごとに1つのクラス」について言及しました。Pythonはファイルを名前空間として使用します。他の言語はそれらの精神をしばしばコピーします。

CまたはC ++を使用している場合、一般的に含まれるファイルが多いほど、ファイルごとのコンパイル時間が長くなります。一方、数が少ないと、小さな変更を加えたときに再コンパイルする量が多くなります。列挙型はCで前方宣言できないため、依存関係の健全性のために、常に他の列挙型のみを含むヘッダーファイルに列挙を配置する必要があります。

それ以外の場合、Javaの「クラスごとに1つのファイル」は妥当ですが、Javaは長い間、コンテナのような内部クラスとその反復子の内部クラスをサポートしてきました。同様に、他の言語では、ヘッダーごとに1つの主要なレコード/構造体/クラス/タイプ/インターフェース/ブロブが必要になりますが、関連するヘルパーまたはコンテナーも含めることもできます。

(コンポーネントモデルを使用する必要はありませんが、そのような深い特定のクラス階層がある場合は、後で自分を嫌うことになります。)


私は階層を例として使用していました。それが私がより良い意味を強調していると感じました。実際のコードでは、コンポーネントに向けて努力しています。
共産主義者のダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.