是否确定了一个工厂方法返回null?(Is it OK for a factory method t

2019-07-30 01:23发布

我在这里想知道的最佳实践。 它是很好的做法对一个工厂方法返回空值,如果它不能创造什么? 下面是一个例子:

ICommand command = CommandFactory.CreateCommand(args);
if (command != null)
    command.Execute();
else
    // do something else if there is no command

另一种方法是返回一个NullCommand什么的,我想,但什么是最好的做法?

Answer 1:

我认为这是合理的潜在的工厂方法在某些情况下返回null, 如果它是一个调用的方法CreateCommand 。 如果是GetCommandFetchCommand ,这可能是正确的...但Create方法应该抛出失败异常,我会建议。

无论你真的希望它返回null在这种情况下当然取决于大局观。 (是否有一个合理的空对象实现,你可以返回代替,例如?)



Answer 2:

返回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 ...
}


Answer 3:

我同意乔恩斯基特。 CreateCommand显然意味着建设。

如果你不会抛出一个Exception ,那么在那种情况下我会亲自去与NullCommand执行,以避免所有的消费者和可能的条件语句NullReferenceException错误。



Answer 4:

它才有意义返回NULL,如果有一个原因,你会希望用户在每次他叫创建时间来检查空。 通常情况下你会考虑以下一个完全有效的使用模式:

var obj = MyFactory.CreateThing();
obj.DoSomething();

但是,你建议是迫使以下使用模式:

var obj = MyFactory.CreateThing();
if (obj == Null) {
    // Handle null condition
} else {
    obj.DoSomething();
}

通常情况下, 的情况将意味着某种故障,在这种情况下的异常可能会作出最感。 但最终,你这里是音乐机和必须决定什么是你正在构建的世界明智的。



文章来源: Is it OK for a factory method to return null?