Вопрос с шаблоном дизайна нулевого объекта

Недавно я просмотрел этот учебник по youtube в шаблоне проектирования Null Object. Несмотря на то, что в нем были некоторые ошибки: например, NullCar, который ничего не делает, создает бесконечный цикл, концепция была хорошо объяснена. Мой вопрос: что вы делаете, когда объекты, которые могут иметь значение null, имеют геттеры и используются в вашем коде? Откуда вы знаете, какое значение для возврата по умолчанию? Или я должен реализовать этот шаблон во всех объектах? Что делать, если мне нужно вернуть строки или примитивы? Я говорю с точки зрения Java.

РЕДАКТИРОВАТЬ: не будет ли я тестировать нулевые объекты для тестирования значений по умолчанию? Если нет, почему бы и нет?

5 ответов

Насколько я понял, идея состоит в том, что значение нулевого объекта как можно ближе к "ничто". Это, к сожалению, означает, что вы должны сами определить это. В качестве примера я лично использую ", когда я не могу передать пустой String, нулевой номер объекта для меня равен -1 (в основном потому, что по умолчанию большинство последовательностей базы данных начинаются с 1, и мы используем их для элемента id: sa lot so -1 является мертвым, давая ему нулевой объект), со списками/картами/устанавливает его Collections.EMPTY_SET, EMPTY_MAP или EMPTY_LIST и т.д. и т.д. Если у меня есть пользовательский класс, я должен создать нулевой объект, я удаляю из него все фактические данные и вижу, где это берет меня, а затем применяю то, что я только что упомянул, пока оно не станет" пустым".

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


Целью Null Object является исключение нулевых ссылок в коде. Значения, возвращаемые получателями Null Object, зависят от вашего домена. Обычно нулевая или пустая строка.

Если мы перенесим шаблон Null Object в реальную жизнь, то, что вы просите, аналогично спросить "сколько лет никому?".

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

EDIT: шаблон дизайна Null Object обычно используется, когда объект делегирует поведение другому объекту (например, в шаблонах стратегии или государственного дизайна); как комментирует Tom Hawtin - tackline, используйте Специальные объекты корпуса для возвращающих объектов объектов.


что вы делаете, когда объекты, которые могут иметь значение null, имеют getters и используются в вашем коде? Как узнать, какое значение для возврата по умолчанию?

Откуда вы знаете, какие классы реализовать? Это вопрос дизайна, это зависит от приложения.

Вообще говоря, целью шаблона NullObject является поддержка рефакторинга Replace Conditional with Polymorphism в специальном случае, где условное обозначение является сравнение с нулевым значением языка программирования.

Правильная реализация примера в видео потребует делегирования метода driveCar классам Car. Классы SlowCar и FastCar выполняли бы цикл, предположительно, через общую реализацию в базовом классе, а NullCar сразу возвращался.

В контексте Java атрибут NullCar.speed, вероятно, будет unboxed int. Поэтому настройка null не является опцией. Скорее всего, я скрою атрибут для доступа, а NullCar.getSpeed создаст исключение. Любой клиентский код, который должен был бы протестировать, чтобы избежать этого исключения, вместо этого переместился бы в классы автомобилей.

Делегирование всех операций, которые напрямую зависят от доступного значения скорости, является приложением принципа Tell Do not Ask объектно-ориентированного дизайн, упомянутый philippe


Он должен вернуть нулевой объект для класса, который вы получаете. Например, если у вас есть класс A с getter, который возвращает объект класса B, то соответствующий NullA getter должен возвращать NullB.


Какая должна быть точка интеграции шаблона Null в коде? Я думаю, что объекты DAO являются клиентом уровня fisrt для этого шаблона проектирования, поскольку они ищут сущность в базе данных и возвращают ее просто.

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

Прокомментируйте.

licensed under cc by-sa 3.0 with attribution.