Вопрос о шаблоне нулевого объекта
Недавно я смотрел этот учебник 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
,