最近、自分のコードの一部を保護することを考えています。オブジェクトが直接作成されないようにするにはどうすればよいのか興味がありますが、ファクトリクラスのメソッドを介してのみ作成できます。「ビジネスオブジェクト」クラスがあり、このクラスのインスタンスが有効な内部状態になるようにしたいとします。これを実現するには、オブジェクトを作成する前に、おそらくそのコンストラクタで、いくつかのチェックを実行する必要があります。このチェックをビジネスロジックの一部にすることを決定するまで、これで問題ありません。それでは、ビジネスロジッククラスのいくつかのメソッドを介してのみ、直接ではなく、ビジネスオブジェクトを作成できるようにするにはどうすればよいでしょうか。C ++の古き良き「フレンド」キーワードを使用する最初の自然な欲求は、C#では不十分です。他のオプションが必要です...
いくつかの例を試してみましょう:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
入力をチェックせずにMyBusinessObjectClassインスタンスを直接作成できることを思い出すまでは問題ありません。その技術的な可能性を完全に排除したいと思います。
それで、コミュニティはこれについてどう思いますか?
CreateBusinessObject
メソッドの目的は、コンストラクターに渡す引数が有効かどうかを呼び出し元がすぐに知らない場合に、単一のメソッド呼び出しで引数を検証して(新しい有効なオブジェクトを返すか、エラーを返す)です。
Distance
負の引数を持つインスタンスを作成すると、ArgumentOutOfRangeException
たとえば、DistanceFactory
同じチェックを行うを作成しても何も得られません。ここであなたが何を得ようとしているのかまだわかりません。