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




Насколько я понял, идея состоит в том, что значение нулевого объекта максимально приближено к «нулю». К сожалению, это означает, что вам придется определять это самостоятельно. В качестве примера я лично использую "", когда я не могу передать пустую строку, номер нулевого объекта для меня равен -1 (в основном потому, что по умолчанию большинство последовательностей базы данных начинаются с 1, и мы используем их для идентификатора элемента: sa lot so -1 мертвая раздача, это нулевой объект), со списками / картами / наборами это Collections.EMPTY_SET, EMPTY_MAP или EMPTY_LIST и так далее и так далее. Если у меня есть собственный класс, из которого мне нужно создать нулевой объект, я удаляю из него все фактические данные и смотрю, куда это меня приведет, а затем применяю то, что я только что упомянул, пока он не станет «пустым».
Таким образом, вы действительно не «знаете», какое значение вернуть по умолчанию, вам просто нужно решить это самостоятельно.
Цель объекта Null - избежать ссылок на Null в коде. Значения, возвращаемые геттерами Null Object, зависят от вашего домена. Обычно подходят нулевая или пустая строка.
Если мы перенесем шаблон «Нулевой объект» в реальную жизнь, то ваш вопрос будет аналогичен запросу «сколько лет никому?».
Возможно, ваш дизайн можно улучшить, поскольку вы, похоже, не следуете принципу скажи, не спрашивай.
Обновлено: Шаблон проектирования нулевого объекта обычно используется, когда объект делегирует поведение другому объекту (например, в шаблонах стратегии или состояния); как прокомментировал Tom Hawtin - tackline, используйте Объекты особого случая для объектов, возвращающих значения.
Ух ты, дзэн тао как подсказка по программированию ... :-)
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.
Я думаю, было бы правильнее прокомментировать, что контекст для шаблона «Нулевой объект» лучше соответствует типам «скажи, а не спрашивай». Для типов, возвращающих значение, вы, скорее всего, направитесь к объектам особого случая. Возможно.