Кажется, растет сообщество людей, говорящих, что вы никогда не должны возвращать нуль и всегда должны использовать шаблон Null Object Pattern. Я могу видеть полезность NOP при использовании коллекции/карты/массива или вызывать логические функции, такие как isAuthenticated(), which is shown here.Null Object Pattern
Я ничего не нашел на этом, что вполне убедительно. Потерпите меня здесь, когда я пытаюсь организовать свои мысли.
Я понимаю, что вместо возврата нулевого объекта вы возвращаете действительный объект, который был «обнулен».
Так, например, клиент будет сделать вызов, чтобы получить объект:
Car car = getCar();
Если не используется NOP вам нужно будет проверить, если объект, возвращаемый из getCar() равно нулю перед вызовом каких-либо методов на нем:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
Использование NOP, вместо getCar()
возвращающей нуль, теперь возвращает объект, который был фактически «обнуление». Так что теперь нам больше не нужно делать if (car != null)
и можете просто запросить цвет. Таким образом, я полагаю, что наш объект «обнуленного» будет возвращать «нет», когда мы будем называть цвет.
Как это помогает? Кажется, что перемещение вперед и вызов методов на пустом объекте вызывает столько же боли, сколько просто проверка нуля. Теперь, когда пришло время отображать информацию, нам нужно проверить, что цвет не является «ничем», что высота не равна 0 или любым другим значениям, которые у вас есть. Поэтому, по сути, вместо проверки в начале обработки, если автомобиль имеет значение null, вы проверяете его, если у нас есть автомобиль или реальный автомобиль. И.Е. мы не хотим отображать кучу пустых объектов, поэтому нам нужно каким-то образом отфильтровать все наши пустые объекты.
Эта фильтрация представляет собой добавленный шаг, аналогичный вызову if (car! = Null). Единственное различие заключается в том, что при проверке null мы можем прекратить обработку, как только обнаружим, что объект автомобиля имеет значение null, бросая исключение, тогда как с NOP мы вызываем методы на пустой объект и продолжаем прерываться, пока не получится время отобразить объект, и в этот момент мы отфильтровываем опорожнения. Кроме того, вам нужно знать значения, возвращаемые вашим пустым объектом. И.Е. getColor() возвращает «none» или «empty».
Очевидно, должно быть что-то, что я пропускаю. Спасибо заранее.
Путь нулевого объекта и, по желанию, не соответствует той же цели. Необязательный используется для указания того, что значение может быть или не быть. Шаблон нулевого объекта просто кодирует тот факт, что объект «ничего не существует», который все еще имеет полезное поведение. – Cubic
Извините, я, возможно, не уточнил, я говорил, что альтернатива null проверкам является опцией, а затем «это ни в коем случае не замена шаблона нулевого объекта» для шаблона нулевого объекта. Я не использовал шаблон нулевого объекта некоторое время, потому что у меня не было недавнего варианта использования, но я ни в коем случае не предлагаю, чтобы опции заменяли шаблон нулевого объекта. –