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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
7 176
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

Если мы перенесем шаблон «Нулевой объект» в реальную жизнь, то ваш вопрос будет аналогичен запросу «сколько лет никому?».

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

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

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

Tom Hawtin - tackline 25.11.2008 23:27

Ух ты, дзэн тао как подсказка по программированию ... :-)

PhiLho 26.11.2008 13:38

what do you do when the objects that can be null have getters , and are used in your code ? How do you know which value to return by default ?

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

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

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

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

Делегирование всех операций, которые напрямую зависят от доступного значения скорости, является применением принципа Скажи, не спрашивай объектно-ориентированного проектирования, упомянутого Филипп.

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

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

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

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

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