Метод возвращает значения и исключения - PullRequest
1 голос
/ 22 декабря 2010

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

Мой выбор:

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

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

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

Ответы [ 5 ]

2 голосов
/ 22 декабря 2010

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

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

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

1 голос
/ 24 декабря 2010

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

1 голос
/ 22 декабря 2010

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

1 голос
/ 22 декабря 2010

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

Имеет ли смысл путь к коду вообще, если нет доступной метки времени? Наверное, нет?

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

1 голос
/ 22 декабря 2010

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

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

Редактировать : изменен ответ на просто особый случай

...