В объектно-ориентированном программировании Null Object — это объект с определенным нейтральным («null») поведением. Шаблон проектирования Null Object описывает использование таких объектов и их поведение (или отсутствие такового). Впервые опубликован в серии книг Pattern Languages of Program Design.

Описание В таких объектно-ориентированных языках как Java или C# объекты могут иметь значение NULL. Ссылки на такие объекты нуждаются в проверке на NULL-значение перед использованием, так как методы класса «нулевого» объекта, как правило, не могут вызываться.

Целью Null-object'а является инкапсулирование отсутствия объекта путём замещения его другим объектом, который ничего не делает.

Данный шаблон проектирования рекомендуется использовать, когда: Объект требует взаимодействия с другими объектами. Null Object не устанавливает нового взаимодействия — он использует уже установленное взаимодействие. Какие-то из взаимодействующих объектов должны бездействовать. Требуется абстрагирование «общения» с объектами, имеющими NULL-значение.http://sourcemaking.com/design_patterns/null_object SourceMaking Tutorial

Плюсы Снижаются шансы на ошибку — не произойдёт разыменование нулевого указателя, потому что его нет.

Минусы Могут неоправданно включаться дополнительные механизмы языка программирования вроде выделения памяти и виртуального полиморфизма. Если интерфейс сложный, нужно много нетворческого кода. Если перед вызовом происходит сложная подготовка, всё равно приходится спрашивать у объекта, делает ли он что-то — но это лишь дополнительная оптимизация, не ведущая к моментальному отказу программы. // Для ясности функции с разными сигнатурами зовутся разными именами.

// Тут никаких вопросов. logger.put("Program started.");

// Запускается тяжёлый format, даже если журнала нет logger.put(std::format("a={}, b={}", a, b));

// Тут format запускается, только если logger реально пишет if (logger.isWriting()) { logger.put(std::format("a={}, b={}", a, b)); }

// Два способа решить, со своими достоинствами и недостатками logger.format("a={}, b={}", a, b); logger.putObj(LazyFormat{"a={}, b={}", a, b});

Структура На диаграмме классов в языке UML шаблон проектирования представлен следующим образом:

Примеры Пример на C#

Пример на PHP

Пример на Java Пример на Python

Пример на Ruby

Примечания

Ссылки Jeffrey Walkers' account of the Null Object Pattern Martin Fowlers' description of Special Case, a slightly more general pattern Null Object Pattern Revisited Introduce Null Object refactoring

Категория:Шаблоны проектирования Категория:Ноль