特定のデータまたは別のオブジェクトを渡してオブジェクトのインスタンスを作成したいが、データまたはオブジェクトが有効であるか、正しい状態である必要があるという状況によく遭遇します。これを行う「正しい」方法について、私はいつも少し不明確です。これが私の例です:
このクラスを考えると:
class BusinessObject()
{
const Threshold = 10;
public BusinessObject(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
{
// performance some business logic
// set properties
}
}
}
これを行うと、いくつかの問題が発生する可能性があります。
var setofdata = new SetOfData<SomeType>();
// if data is not valid then the object will be created incorrectly
var businessObject = new BusinessObject(setofdata);
したがって、私の解決策は常に次のいずれかでした。
class BusinessObjectBuilder()
{
public BusinessObject Build(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
}
または、コンストラクタをプライベートにして、静的ファクトリ メソッドを追加します。
class BusinessObject()
{
const Threshold = 10;
public static Create(SetOfData<SomeType> setofdata)
{
if (setofdata.count > Threshold)
{
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
private BusinessObject(SetOfData<SomeType> setofdata)
{
// performance some business logic
// set properties
}
}
理想的には、1 つのプロセスで複数のビジネス オブジェクトが作成されている可能性があるため、データが無効な場合に例外をスローしたくありません。
また、Abstract Factory または Factory メソッドについて私が読んだすべての例では、何らかの型または列挙型を渡し、正しいオブジェクトを構築して返す必要があります。彼らはこのシナリオをカバーしていないようです。
では、このシナリオの規則は何ですか? アドバイスをいただければ幸いです。