web-dev-qa-db-ja.com

1つの.csファイル内の複数のクラス-良いですか悪いですか?

.csファイル内に複数のクラスを作成することをお勧めしますか、または各.csファイルに個別のクラスを含める必要がありますか?

例えば:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

これが優れたアーキテクチャの悪い例であるという事実を1分間回避すると、.csファイルに複数のクラスが存在し、コードのにおいがしますか?

29
Sergio

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

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

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

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

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

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

30

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

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

クラスファイルを物理的に分離すると、(結局のところすべてではないことに注意してください)問題の分離と疎結合が生まれます。

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

11
Jesse C. Slicer

簡単に言えば、これを行うのは良い形ではありません。理由を説明します。少し後でソリューションが大きくなると、クラスがどこにあるかを忘れてしまいます。ファイル名は、内容やファイル名を表していないためです。 AnimalPersonObject.csは実現不可能です。

確かに、resharperなどのツールの機能を使用してタイプにジャンプすることでこれを回避できますが、ファイル(インターフェースを含む)ごとに1つのクラスは、.netだけでなくJavaとc ++、およびその他の多くの言語。メンテナンスの問題があまり発生しない言語であり、ジュニア開発者がコードを把握するのが難しいことに気付くでしょう。

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

7
krystan honour

ファイルが非常にまとまりのあるものである場合(たとえば、いくつかの非常に短い類似した名前のファイルを使用する代わりになる場合)、それは良いアイデアになる可能性があります。

たとえば、Fluent NHibernateを使用する場合、EntityEntityMapを1つのファイルに保存しておくと、ツールで何を言わなければならない場合でも簡単です。

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

7
mootinator

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

3
Julia Hayward