Стоит ли шаблон нулевого объекта? - PullRequest
5 голосов
/ 05 августа 2009

Я смотрел на шаблон нулевого объекта, и мне интересно, стоит ли его реализовывать или использовать проверки «если» для нулей в моем коде intsead. Когда я посмотрел на реализации, мне кажется, что сложно синхронизировать объекты с их нулевыми реализациями. Внося изменения в основной объект, мы должны проверить, что нулевой объект ведет себя так, как ожидалось, и его легко допустить ошибки реализации. Не так ли?

EDIT

Избегайте проверки на нулевое значение: http://www.invisible -city.com / sharon / 2009/03 / null-object-pattern-when-slacker-is.html или http://journalofasoftwaredev.wordpress.com/2008/08/19/null-object-pattern-by-example/

Ответы [ 5 ]

4 голосов
/ 05 августа 2009

Если ваш объект, являющийся нулевым, будет нормой во всем вашем коде, вы могли бы также использовать шаблон. Я проверяю нулевое значение, когда объект не был создан и его необходимо создать . Я на самом деле не использую нуль для чего-либо еще, и, конечно же, я не использую его для обозначения не определенного поведения.

Если, однако, вы используете нуль, чтобы обозначить, что поведение еще не определено или поведение по умолчанию - ничто, тогда обязательно используйте шаблон.

2 голосов
/ 05 августа 2009

Я имел большой успех, используя нулевые объекты с моими реализациями Factories и IoC. Они особенно полезны для вертикальных функций приложения. Я бы не стал создавать его для действия, которое является ключевым для вашего приложения.

Например, у вас есть интерфейс IPrinter и пара объектов, которые его реализуют - PrinterX и NullPrinter. При инициализации IPrinter вы можете попытаться запустить PrinterX, но если это не удастся, вместо этого вы получите NullPrinter. В этом случае печать является функцией приложения, но не обязательной для его успешного запуска.

2 голосов
/ 05 августа 2009

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

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

Иногда я нахожу довольно чистый шаблон, чтобы не проверять с помощью ifs необязательное поведение, которое может существовать или не существовать в определенном состоянии моего приложения.

0 голосов
/ 30 октября 2015

Существует множество заблуждений относительно шаблона проектирования NULL, так как он помогает избежать проверок NULL. На самом деле побочным эффектом шаблона проектирования объектов NULL является то, что вам не нужно выполнять NULL checl. Но NULL-проверки хороши и необходимы. Шаблон проектирования NULL заполняет отсутствие объекта и должен использоваться, когда объекты сотрудничают с каждым.

Прочтите эту статью, в которой подробно рассказывается о шаблоне проектирования объектов NULL

http://www.codeproject.com/Articles/1042674/NULL-Object-Design-Pattern

Некоторые примечания о шаблоне проектирования NULL, которые устранят путаницу в этом шаблоне.

  1. Шаблон проектирования NULL заполняет ОТСУТСТВИЕ объекта с поведением DEFAULT и должен использоваться только тогда, когда один объект сотрудничает с другим.
  2. Шаблон проектирования NULL не предназначен для замены обработки исключений NULL. Это одно из побочных преимуществ шаблона проектирования NULL, но цель состоит в том, чтобы обеспечить поведение по умолчанию.
  3. Проверки NULL не следует заменять объектами шаблона проектирования NULL, поскольку это может привести к скрытым дефектам в приложении.
    1. Шаблон проектирования NULL полезен в модульном тестировании и гибкой разработке.
    2. Классы NULL - это классический случай применения шаблона проектирования Singleton и обеспечения неизменности классов.

Этот шаблон чаще всего встречается в сочетании с декоратором и заводским шаблоном.

0 голосов
/ 05 августа 2009

Я удостоверяюсь, что мои IEnumerable элементы являются пустыми перечислениями вместо null, но если что-то действительно отсутствует, что не так с null? Иногда мне нужно различать неинициализированный и отсутствующий в ситуации ленивой инициализации, но тогда я обычно использую отдельную логическую переменную для указания состояния, поэтому любое значение (включая null) действительно для самого целевого объекта.

...