単一の.csファイル内の複数のクラス-良いか悪いか?[閉まっている]


30

.csファイル内に複数のクラスを作成することをお勧めしますか、それとも各.csファイルに個別のクラスが必要ですか?

例えば:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

これが良いアーキテクチャの貧弱な例であるという事実を少し避けて、.csファイルに複数のクラスがあることはコード臭いですか?

回答:


30

私の意見では、あなたが与えた例は実際には問題ありません。あなたは内部クラスを宣言しているので、それらを同じファイルに保管するのは完全に賢明です。これを回避する唯一の方法は、Itemsクラスを部分クラスにし、それを複数のファイルに分割することです。私はこの悪い習慣を検討します。ネストされたクラスの私の一般的なポリシーは、それらが小さくプライベートであることです。これには2つの例外があります。

  • クラスクラスター(objective-cでより一般的)を設計しているため、部分クラスアプローチを使用するのが賢明かもしれません。
  • 親クラスのパブリックAPIでのみ使用される列挙が必要です。この場合、名前空間を汚染するのではなく、親クラス内でパブリック列挙型を宣言することを好みます。「内部列挙」である列挙型は、効果的に適切に定義されたスコープを与えます。

質問を少し違った言葉で言い、「各名前空間レベルのクラスを独自のファイルに入れるべきか」と尋ねると、私の答えは「はい」になります。

クラスを設計するときは、単一​​責任の原則を尊重します。コードの形がセマンティクスに従うとコードが読みやすくなります。したがって、クラスごとにファイルを分割するのが賢明です。

機械的な観点からは、クラスごとにファイルを持つことにはいくつかの利点があります。異なるウィンドウで複数のクラスを同時に開くことができます。真面目な開発者は2つ未満の画面で作業しないため、これは特に重要です。頭のでより多くのコンテキストを持つことができるということは、頭の中より多くのコンテキスト維持できることを意味ます。(ほとんどのIDEでは同じファイルを2回開くことができますが、これは厄介です)。

次の重要な側面は、ソース管理とマージです。クラスを分離しておくことで、同じファイルに変更が加えられたときに、別のクラスを変更する必要があるため、多くの面倒を回避できます。


1
同意しますが、私の経験では内部クラスは非常にまれです。公平に言うと、実際に内部クラスを正当化できるほど多くはありません。私が知っている唯一のケースは、列挙できる限り、実際のクラスについて実際にはないIEnumerableクラスです。他のすべての場合、各クラスは独自のファイルを取得する必要があります。ソース管理の問題のために他の理由がない場合。
-Homde

2
私は、内部クラスはまれな例外であるべきであり、それらがパブリックであるべきではないことを付け加えます。
ジョシュ

ヤップはマークから非常に迅速であることを教えてくれます、内部クラスは大丈夫ですが、内部クラスを使用するかどうかを尋ねるのは別の質問です:)
krystan honor

11

正直に言うと、ファイルに複数のルートクラスを追加しないでください。私の最後の仕事では、複数のクラスだけでなく、複数の名前空間を持つファイルがあり、これは数千行のコードに広がっていました。 フォローするのは非常に難しい。

密接に関連するクラスがある場合は、それらのファイルに同様の名前を付けるか、サブフォルダーに入れます。

クラスファイルを物理的に分離すると、すべての問題が解決するわけではなく、懸念の分離と疎結合の発生に役立ちます。

一方、この例では複数のルートクラスを示していません。ネストされたクラスがいくつかあります(注:ネストしたクラスを作成しないでください。ただしprivate、これを設計できる場合のみ)。これは、1つのファイルに含めるのにまったく問題ありません。


3
ああ、それはひどいようだ。

なぜ質問するのですか?誰かがあなたに賛成票を投じましたが、その理由を尋ねたいですか?

待って...あなたは私の最後の仕事についての小さな逸話について言及していましたか?もしそうなら、私はそのようなことを誤解し、謝罪します。
ジェシーC.スライサー

完全に同意します。私は、ほとんどのファイルがファイルごとに少なくとも4つのクラスを持つプロジェクトに取り組んでいます。また、ファイルごとに最大22個のクラス+ 1個のインターフェイスを持つものもあります。
L_7337 14

7

ファイルが非常にまとまりがある場合、たとえば、いくつかの非常に短い、同様の名前のファイルを持つ代わりにファイルを使用する場合は、良いアイデアです。

たとえば、Fluent NHibernateを使用する場合、ツールがそれについて何と言っていても、1つのファイルに保存しておくEntityと簡単ですEntityMap

ほとんどの場合、クラスを見つけるのが難しくなります。慎重に使用してください。


1
特にFluent NHibernateの場合、同じファイルだけでなく、同じクラスにそれらを保持することが有用であることがわかりました。すべてのエンティティには、Mapというネストされたクラスがあります。
ジェームズベニンガー

7

単純に「はい」、これを行うには良い形式ではありません。その理由を説明します。ソリューションが大きくなると、ファイル名が内容やファイル名を表さないため、クラスの場所を忘れてしまいます。 AnimalPersonObject.csは実行不可能です。

もちろん、resharperなどのツールの機能を使用して型にジャンプすることでこれを回避できますが、ファイルごとに1つのクラス(インターフェイスを含む)は、.netだけでなくJavaで見たコード標準のバックボーンです。 c ++や他の多くの言語、メンテナンスの問題が頻繁にない言語、そしてジュニア開発者がコードを把握するのが難しいことに気付くでしょう。

ほとんどすべてのコード最適化ツールは、クラスを別のファイルに移動するよう指示するため、私にとってはこれはコードの匂いであり、それを中和するためにいくつかの追い出しが必要です:)


3

別の問題は、同じファイルに非常に大きく類似したクラスがある場合- クラス宣言が常に表示されない場合-間違ったクラスにブレークポイントを配置し、なぜヒットしないのか疑問に思うことです...うん!:)


-3

基本的に、「スコープ」の観点から「親」クラス内からのみこのクラスを使用する必要がある場合は、通常、ネストされたクラスとして定義するのが適切です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.