我经常遇到这样的情况,我想通过传递一些给定的数据或者另一个对象来创建一个对象实例,但是这些数据或者对象必须有效或处于正确的状态。我总是有点不清楚如何做到“正确”。以下是我的示例:
假设有这个类:
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
}
}
理想情况下,如果数据无效,我不想抛出异常,因为在一个过程中可能会创建多个业务对象,如果有一个验证失败,我不希望整个过程失败,而捕获和抑制异常是不好的。
此外,我阅读的所有Abstract Factory或Factory方法的示例都涉及传递某种类型或枚举,并构建和返回正确的对象。他们似乎从来没有涵盖过这种情况。
那么,在这种情况下的惯例是什么?任何建议将不胜感激。
SetOfData<SomeType>
),也可以不接受任何数据(无参数)。示例倾向于使用它们,因为这是一种相当常见/简单的使用/描述方式。如果您愿意,您始终可以为工厂创建一个BusinessObjectValidator
来利用它来检查参数,但如果检查像您所描述的那样简单,我宁愿在工厂创建方法中添加它。 - Chris Sinclair