我在这里想知道的最佳实践。 它是很好的做法对一个工厂方法返回空值,如果它不能创造什么? 下面是一个例子:
ICommand command = CommandFactory.CreateCommand(args);
if (command != null)
command.Execute();
else
// do something else if there is no command
另一种方法是返回一个NullCommand
什么的,我想,但什么是最好的做法?
我认为这是合理的潜在的工厂方法在某些情况下返回null, 但如果它是一个调用的方法CreateCommand
。 如果是GetCommand
或FetchCommand
,这可能是正确的...但Create
方法应该抛出失败异常,我会建议。
无论你真的希望它返回null
在这种情况下当然取决于大局观。 (是否有一个合理的空对象实现,你可以返回代替,例如?)
返回null
在这种情况下,将会使你的方法很难使用; 客户必须要知道的隐性故障状态。 取而代之的是,抛出一个异常,你也可以提供一个单独的方法为客户测试此条件:
if (CommandFactory.CanCreate(args)) {
ICommand command = CommandFactory.Create(args);
command.Execute();
}
或使工厂实例化的; 如果你需要预先处理,其效果会更好args
:
CommandFactory factory = new CommandFactory(args);
if (factory.IsValid()) {
ICommand command = factory.Create();
command.Execute();
}
工厂的接口,使得现在有清晰和明确的是创建可能会失败,但它仍然需要在客户端使用的检查方法。 另一种选择是这样的:
ICommand command;
if (CommandFactory.TryCreate(args, out command)) {
// creation succeeded ...
}
我同意乔恩斯基特。 CreateCommand
显然意味着建设。
如果你不会抛出一个Exception
,那么在那种情况下我会亲自去与NullCommand
执行,以避免所有的消费者和可能的条件语句NullReferenceException
错误。
它才有意义返回NULL,如果有一个原因,你会希望用户在每次他叫创建时间来检查空。 通常情况下你会考虑以下一个完全有效的使用模式:
var obj = MyFactory.CreateThing();
obj.DoSomething();
但是,你建议是迫使以下使用模式:
var obj = MyFactory.CreateThing();
if (obj == Null) {
// Handle null condition
} else {
obj.DoSomething();
}
通常情况下, 空的情况将意味着某种故障,在这种情况下的异常可能会作出最感。 但最终,你这里是音乐机和必须决定什么是你正在构建的世界明智的。