Вопрос о шаблоне нулевого объекта

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

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

5 ответов

Решение

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

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

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

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

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

РЕДАКТИРОВАТЬ: шаблон проектирования Null Object обычно используется, когда объект делегирует поведение другому объекту (например, в шаблонах проектирования стратегии или состояния); как прокомментировал Том Хоутин, tackline, используйте объекты Special Case для объектов, возвращающих значения.

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам