2008-11-25 3 views
5

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

EDIT: Я не буду торговать тестированием нулевых объектов для тестирования значений по умолчанию? Если нет, почему бы и нет?

ответ

4

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

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

8

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

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

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

EDIT: Null Object design pattern обычно используется, когда объект делегирует поведение другому объекту (например, в стратегиях или шаблонах государственного дизайна); как комментирует Tom Hawtin - tackline, используйте Special Case Objects для возвращаемых значений объектов.

+0

Я думаю, было бы более точным прокомментировать, что контекст для шаблона Null Object лучше встречается с типами «рассказывать, не спрашивать». Для типов возвращаемых значений вы, скорее всего, направляетесь к специальным объектам Case. Возможно. – 2008-11-25 20:27:06

2

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

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

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

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

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

Делегирование все операции, которые непосредственно зависят от значения скорости, являющимся доступным является применение Tell Don't Ask принципа объектно-ориентированного проектирования упоминается philippe

0

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

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

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

0

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

Смежные вопросы