C#でいつクラスをネストしますか? [複製]
-
07-07-2019 - |
質問
この質問にはすでに回答があります:
具体的には、ネストされたクラスを使用する場合と使用しない場合の具体的な例を教えていただけますか?
この機能については永遠に知っていますが、使用する理由はありませんでした。
ありがとう。
解決
ネストされたクラスが外部クラスでのみ使用される場合、コレクションの列挙子クラスの場合は、もはや必要ではない素晴らしい例です。
別の例として、呼び出しシグネチャを明確にするために、クラス内のメソッドで使用されるtrue falseパラメーターをenumで置き換えることがあります...
の代わりに
public class Product
{
public void AmountInInventory(int warehouseId, bool includeReturns)
{
int totalCount = CountOfNewItems();
if (includeReturns)
totalCount+= CountOfReturnedItems();
return totalCount;
}
}
and
product P = new Product();
int TotalInventory = P.AmountInInventory(123, true);
「true」の意味が不明な場合は、次のように記述できます。
public class Product
{
[Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
public void AmountInInventory(int warehouseId, Include include)
{
int totalCount = 0;
if ((include & Include.New) == Include.New)
totalCount += CountOfNewItems();
if ((include & Include.Returns) == Include.Returns)
totalCount += CountOfReturns();
return totalCount;
}
}
product P = new Product();
int TotalInventory = P.AmountInInventory(123, Product.Include.All);
クライアントコードでパラメーター値を明確にするもの。
他のヒント
ネストされたクラスを使用する2つの場所:
-
ネストされたクラスは外部クラスによって排他的に使用され、完全にプライベートなスコープが必要です。
-
ネストされたクラスは、特に他の場所で定義されたインターフェースを実装するために使用されます。たとえば、列挙子の実装はこのカテゴリに分類されます。
ネストされたクラスが他の場所で使用されることを意味がないと確信している場合にのみ、ネストされたクラスを使用する必要があります。
たとえば、メソッドやプロパティなど、オブジェクトのセットに関する関数とメンバー情報に関連付けられたいくつかのタイプのオブジェクトのリストを作成する必要がある場合、ネストされたクラスを使用してそれを行うことができます。ある種のオブジェクトのすべての組み合わせのリストを作成し、特定のプロパティを持つすべての組み合わせをマークする必要があるかもしれません。これは、ネストされたクラスの場合に適しています。
ネストされたクラスのメソッドが必要ない場合は、おそらく struct を使用できますが、ILがそれらを異なる方法で処理するかどうかはわかりません。
時々、親クラス内の関数または2つに必要な単純なヘルパークラスにこれを使用します。
実際の例については、今朝早くに尋ねられたこの質問をご覧ください:
オブジェクトにのみアクセス可能にする同じアセンブリ内の他のオブジェクト?
概要:関連するデータクラスをビジネスオブジェクト内にネストできます。
特別な目的のデータ構造が1つのクラス内でのみ使用される場合、または特定の例外が1つのクラス内でのみスローおよびキャッチされる場合、ネストされたクラスのケースを見てきました。
システム内の他のオブジェクトから見える必要のないヘルパークラスがある場合、クラスをネストします。これにより、可視性が可能な限り制限され、クラスの意図しない使用を防ぐのに役立ちます
凝集に関するボブおじさんの「ルール」に従うと、実際にかなりの数のネストされた(およびネストされた、ネストされた)クラスを作成することがわかります。これらをネストしないことができますが、現在それらを参照している他のクライアントがある場合にのみのみ。
以前の回答を改善したいです!
ネストされたクラスを定期的に使用する特定の領域は、インターフェイスインジェクションと制御の反転を有効にすることです。例...
public class Worker
{
private IHelper _helper;
public Worker()
: this (new DefaultHelper())
{
}
public Worker(IHelper helper)
{
this._helper = helper;
}
private class DefaultHelper : IHelper
{
}
}