Возвращаемые значения метода и исключения

У меня есть интерфейс iIncident который определяет единственный метод, when() . when() должен возвращать объект DateTime . Я пытаюсь решить, что делать, если $object->when() не имеет DateTime для возврата, как может быть, сразу после создания объекта и перед установкой всех его свойств.

Мой выбор:

  1. return false
  2. бросить какое-то Exception
  3. вернуть значение по умолчанию DateTime например '9999-01-01'

Моя склонность состоит в том, чтобы пойти с Exception поскольку $object действительно не может действовать как инцидент, пока он не узнает, когда он произошел. Я не хочу возвращать DateTime умолчанию, потому что это затрудняет сравнение, и это неверно. И я действительно не хочу возвращать false, потому что тогда я должен проверять его каждый раз, когда я вызываю метод, – но если это предпочтительный метод, я думаю, я это сделаю.

Лучше ли выбрасывает исключение? И есть ли предопределенный тип исключения, который я должен использовать (ни один из SPL не казался мне особенно подходящим, но это может указывать на отсутствие опыта)?

Я думаю, проблема заключается в том, что вы разрешаете создание объекта в непоследовательном состоянии. Если объект должен иметь возможность создавать значения даты, он должен получить все зависимости, которые ему нужно сделать в своем конструкторе, а не через свойства. Если это невозможно, то вы должны попытаться инкапсулировать процесс строительства через фабричный (или заводский метод).

Возвращает null вместо false . Это самый распространенный и естественный способ. И да, вам придется каждый раз проверять возвращаемое значение.

Редактировать:

Вы можете исключить исключение, но только если метод when() не может вернуть DateTime из-за некоторой ошибки или чего-то еще.

Я поклонник возвращения ложного себя. Логически мне представляется условие «если» просто указать if($object->when() && $object->when()->before($otherdate)) т. Д. Вместо того, чтобы возвращать дату по умолчанию (например, 31.12.1969, где это действительная дата).

Исключения для исключительных условий. Попытка читать / действовать на частично построенном объекте довольно необычна.

Действительно ли код имеет смысл, если нет метки времени? Возможно нет?

Выбросьте (и поймите, если необходимо) исключение.

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

Решение состоит в том, чтобы продлить DateTime и создать специальный случай (496) , возможно, названный DateTimeNone .

Изменить : измененный ответ на только специальный случай