Вопрос о шаблоне нулевого объекта - PullRequest
5 голосов
/ 25 ноября 2008

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

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

Ответы [ 5 ]

8 голосов
/ 25 ноября 2008

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

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

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

EDIT: шаблон проектирования Null Object обычно используется, когда объект делегирует поведение другому объекту (например, в шаблонах разработки стратегии или состояния); как прокомментировал Том Хоутин, используя Особые случаи объектов для объектов, возвращающих значения.

4 голосов
/ 25 ноября 2008

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

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

3 голосов
/ 25 ноября 2008

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

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

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

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

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

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

0 голосов
/ 16 декабря 2015

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

0 голосов
/ 28 ноября 2014

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

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

Пожалуйста, прокомментируйте.

...