C#クラスはそれ自体のインスタンスを生成する必要がありますか?
-
05-07-2019 - |
質問
CallRate型を定義するクラスがあります。ファイルからデータを読み取ることにより、クラスの複数のインスタンスを作成する機能を追加する必要があります。
List<CallRate>
を返す静的メソッドをクラスCallRateに追加しました。クラスが独自のコンストラクターの1つを呼び出して、それ自体の新しいインスタンスを生成しても大丈夫ですか?それはうまくいきます、それが適切なことかどうかだけです。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
解決
静的メソッドから独自のオブジェクトを取得しても問題ありません。
e.g。
ドットネットライブラリの1つは、あなたと同じことを行います
XmlReadrer reader = XmlReader.Create(filepathString);
他のヒント
これで問題ありません。場合によっては奨励されます。いくつかのオブジェクトの作成を処理するデザインパターンがあり、そのうちのいくつかは単にあなたが説明していること。
パラメーターの有効性を確認する必要がある場合、このパターンをよく使用します。コンストラクターから例外をスローすることは強くお勧めしません。ファクトリメソッドからそれほど悪くないか、nullを返すことを選択できます。
私にはいいようです。他の言語ではおそらく関数を書くでしょうが、C#のような言語では、静的メソッドがその役割を担います。
大丈夫です。作成したのは、単純なファクトリメソッドのようなものです。型の有効なインスタンスを作成する静的メソッドがあります。実際、メソッドは静的である必要すらなく、有効なコードが残っています。既存のオブジェクトから新しい有効なオブジェクトを作成するデザインパターン(プロトタイプ)があります。詳細は、 http://www.dofactory.com/Patterns/PatternPrototype.aspx をご覧ください。 。
確かに、単純な解析(または同様の)シナリオの場合-実際に優先しています>ファクトリメソッドはクラスの一部です。はい- SRP を破りますが、 KISS -だから私はそれを純利益と呼んでいます。より大きなアプリ、またはより複雑な解析ルーチンの場合、外部ファクトリクラスにする方が理にかなっています。
特定のケースでは、おそらくIEnumerable <!> lt; string <!> gt;を取り込んだメソッドを好むでしょう。ファイル名の代わりに-構文解析ロジックを提供しますが、簡単な単体テストと<!> quot; reuse <!> quot;を許可します。呼び出し元は、ファイルを簡単にIEnumerableにラップできます。
多くの場合、ファクトリメソッドは優れた設計です。 C#で作成するときは、「新規」と呼んでいます。
new MyClass()
なる
MyClass.New()
簡単に次のように実装されます:
class MyClass
{
public static MyClass New()
{
return new MyClass();
}
}
ほとんどの場合、実際にクラスを作成するか、単にnull
を返すか、またはMyClass
またはその派生物を返すかについて追加の条件がある場合にこれを行います。
時々、コンストラクターのオーバーロードの代替手段として、パブリック静的メソッドを使用します。
特に、どのような種類のオブジェクト構築が意図されているかを示すためにパラメータタイプのみに依存するのが望ましくない状況では。
私は、上記で何度も示唆されているように、静的メソッドがインスタンスを返すことを好む。
@Paul:上記のコメントにチェックを入れることを忘れないでください。これが最良の答えです。
指摘したい <!> quot;独自のコンストラクタの1つを呼び出して、自身の新しいインスタンスを生成します<!> quot;
コンストラクタからではなく、静的メソッドからです。
通常、クラスのインスタント実装が必要な場合にこれを使用します。例
public class Car
{
public static Car RedExpensiveCar = new Car("Red", 250000);
public Car()
{
}
public Car(string color, int price)
{
Color = color;
Price = price;
}
public string Color { get; set; }
public int Price { get; set; }
}
これにより、コード内でコンストラクタパラメータを覚えたり、記述する必要がなくなります。
Car car = Car.RedExpensiveCar;
これを行うことは完全に受け入れられます。行うときは、通常、クラスの実際のコンストラクターをprivateにして、インスタンスを構築する only 方法が静的メソッドを使用することであることを明確にします。
これは、<!> quot; construction <!> quot;常に新しいインスタンスを返すとは限りません。たとえば、以前にキャッシュされたオブジェクトを代わりに返すことができます。