Подтвердить что ты не робот

Можно ли использовать метод factory для возврата null?

Мне интересно узнать о лучшей практике здесь. Является ли хорошей практикой метод factory возвращать значение null, если он ничего не может создать? Вот пример:

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

Альтернативой было бы вернуть NullCommand или что-то, я думаю, но что лучше всего?

4b9b3361

Ответ 1

Я думаю, что потенциально разумно для метода factory возвращать значение null в некоторых ситуациях, но не если это метод под названием CreateCommand. Если это были GetCommand или FetchCommand, это может быть хорошо... но метод Create должен вызывать исключение при отказе, я бы предложил.

Если вы действительно хотите, чтобы он вернулся null, в этой ситуации, конечно, зависит от большей картины. (Есть ли разумная реализация нулевого объекта, которую вы могли бы вернуть, например?)

Ответ 2

Возврат null в этом случае сделает ваш метод более трудным для использования; клиенты должны знать о неявном состоянии отказа. Вместо этого выведите исключение, и вы также можете предоставить отдельный метод проверки клиентами для этого условия:

if (CommandFactory.CanCreate(args)) {
  ICommand command = CommandFactory.Create(args);
  command.Execute();
}

Или сделать factory доступным; что было бы лучше, если вам нужно предварительно обработать args:

CommandFactory factory = new CommandFactory(args);
if (factory.IsValid()) {
  ICommand command = factory.Create();
  command.Execute();
}

Интерфейс factory теперь дает понять и ясно, что создание может завершиться неудачей, но для этого все еще требуется, чтобы клиент использовал метод проверки. Другой вариант:

ICommand command;
if (CommandFactory.TryCreate(args, out command)) {
  // creation succeeded ...
}

Ответ 3

Я согласен с Джоном Скитом. CreateCommand ясно подразумевает конструкцию.

Если вы не будете бросать Exception, то в этом случае я бы лично пошел с реализацией NullCommand, чтобы избежать условных утверждений для всех потребителей и возможных ошибок NullReferenceException.

Ответ 4

Только имеет смысл вернуть Null, если есть причина, по которой вы хотите, чтобы пользователь должен был проверять значение null каждый раз, когда он вызывает Create. Как правило, вы считаете, что это абсолютно допустимый шаблон использования:

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

Но то, что вы предлагаете, это принудительно использовать следующий шаблон использования:

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

Обычно сценарий Null будет означать какой-то провал, и в этом случае исключение, вероятно, будет иметь наибольший смысл. Но в конечном итоге вы здесь создатель музыки и должны решить, что разумно в мире, который вы строите.