10

クラスが別のクラスでのみインスタンス化される場合は、そのクラスにネストして使用するのが正しいと考えています.これは良い設計に役立つと思います.私のプロジェクトを見ると、そのようなネスト構造はほとんど見たことがありません.しかし、クラスをネストしようとすると、今度は別の質問が頭に浮かびます.たとえば

Board クラス、ShortCastle、LongCastle、EnPassant、Promote などの Move クラスと、Pawn、Queen、Rook、Knight などの Pieces があります。したがって、Board クラスが Piece クラスをインスタンス化し、Piece クラスが Move クラスをインスタンス化することは明らかです。優れた設計では、プロモート ムーブ クラスはポーンのネストにする必要があります。これは、ポーンだけが自身をプロモートできるためです。短いキャッスルと長いキャッスルはキングのネストにする必要があります。キングだけがそのようなタイプのムーブを持つことができるからです。

すべての Piece クラスを Board クラスに入れようとすると、8 ~ 9 クラスが Board クラス内に配置され、1 つの Board クラス ファイルが大きすぎて読みにくくなるため、見栄えがよくありません。ファイル。部分的なボード クラスを作成できるのは良いことですが、それでも、8 ~ 9 個の部分的なボード クラス ファイルが各ピース クラスを保持するのは面倒ではありませんか? それらを入れ子にしない方が良いですか?Pieces についても同じです 別の Move タイプ クラス用に別の部分的な Piece ファイルを作成しますか? ネストされたクラスが小さなスペースしかとらない場合は問題ありませんが、多くのメソッドが必要な場合は?

4

5 に答える 5

11

ネストされたクラスに寛大すぎると思います。ネストされた型のこの設計ガイドラインをご覧ください。

以下に該当する場合は、ネストされた型を使用しないでください。

  • 型は、クライアント コードによってインスタンス化する必要があります。型にパブリック コンストラクターがある場合は、おそらく入れ子にしないでください。このガイドラインの背後にある理論的根拠は、ネストされた型をインスタンス化できる場合、その型が単独でライブラリ内に配置されていることを示しているということです。外側の型を使用せずに、作成、使用、および破棄できます。したがって、ネストしないでください。内側の型は、外側の型と関係なく、外側の型の外側で広く再利用されるべきではありません。
  • 型への参照は、通常、クライアント コードで宣言されます。

ピースはボード(メンバーとしてのピースコレクション?)に属しているかもしれませんが、それなしで共存することができます。ピースなしでボード (テーマなど) を再利用したり、ボードなしでピース (ポジションなど) を再利用したりすることもできます。

于 2010-06-29T18:42:59.550 に答える
2

親クラスのプライベート メンバーは、Nexted クラス メソッドにアクセスできます。

Nexted クラスを使用すると、広範なスコープなしで複雑さを軽減できます。

于 2010-06-29T18:47:05.110 に答える
1

ポーンだけが自分自身をプロモートできるため、優れた設計のためには、プロモート ムーブ クラスをポーンのネストにする必要があります。

私は本当に同意しません。クラスをネストできるからといって、そうすべきだというわけではありません。これらのクラスをネストすることで得られるメリットを自問してください。

于 2010-06-29T21:13:01.953 に答える
0

ネストされたクラスには適切な場所がありますが、操作が混乱する可能性があります。http://www.virtualsecrets.com/graph-api-json-facebook-handler.htmlで、いくつかの .Net クラスを使用して Facebook のウォール投稿の JSON 出力を取得する方法を示す Web ページを見つけました。クラスはクラスの内部、他のクラスの内部にネストされているため、少し複雑ですが実行できます。:)

于 2012-06-20T12:19:33.843 に答える
0

ネストされたクラスが設計にとって理にかなっていると本当に本当に思っているが (Tim Schmelter の忠告を参照)、ファイル サイズが大きすぎると感じている場合は、ネストされたクラスの定義を独自のファイルに分割するために部分クラスを使用しても問題ありません。または、ネストされたクラスがそれ自体では十分に小さいのに多数ある場合は、ネストされたすべてのクラスを 1 つの部分ファイルに入れます。

親.cs:

public partial class Parent
{
    void SomeMethod()
    {
        Nested1 n1 = new Nested1();
        Nested2 n2 = new Nested2();
    }
}

ネストされた.cs:

public partial class Parent
{
    private class Nested1
    {

    }
    private class Nested2
    {

    }
}
于 2010-06-29T18:54:14.593 に答える