Проверка недопустимого состояния при использовании шаблона Null Object - PullRequest
0 голосов
/ 30 июня 2009

При использовании шаблона Null Object, как бы вы «проверили», является ли ситуация недействительной? например, если в хранилище не найдено ни одного элемента, отобразить сообщение «not found» для пользователя.

Должен ли я сделать прославленную нулевую проверку?

  1. if obj.equals (new NullObject ()) {showNotFound (); }
  2. if obj.ID.equals (INVALID_ID) {showNotFound (); }

Кажется, что эти техники побеждают цель самого шаблона Null Object

Ответы [ 4 ]

5 голосов
/ 30 июня 2009

Проблема в том, что вы используете шаблон Null Object в сценарии, где нет нейтрального поведения. В дополнение к тому, что сказал Мэтью, использование этого шаблона имеет смысл только тогда, когда вы хотите вызвать операцию, не беспокоясь о том, что ссылка пуста.

c2.com wiki приятно подводит итог:

Я недавно сталкивался с этой проблемой с шаблоном нулевого объекта (см. NullObjectAndRefactoring). Мое мнение является то, что если код приложения должен проверьте, использует ли он NullObject или нет, значит система больше не используя шаблон нулевого объекта вообще, потому что класс NullObject был «повышен» из простого детали реализации, чтобы быть Концепция в домене приложения.

2 голосов
/ 30 июня 2009

По-моему, вы правы. Если вам нужна такая функциональность, просто используйте null, сделайте проверку null и ответьте на ваше нулевое состояние.

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

1 голос
/ 30 июня 2009

Использование вашего нулевого объекта таким способом не является шаблоном нулевого объекта, если вы действительно хотите использовать этот шаблон, тогда вы можете. Например, если у вашего объекта есть свойство Name, просто отобразите его, где нулевой объект отобразил ваше сообщение «not found» в качестве имени ... но оно может не соответствовать вашей работе.

1 голос
/ 30 июня 2009

Цель паттерна Null Object состоит в том, чтобы избежать необходимости делать нулевые проверки, когда вы хотите вызывать методы для значения, которое возможно является нулевым. Но поскольку вы специально хотите иметь дело с нулями как с особым случаем, нет никакой возможности обойти проверку нуля.

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

...