我有一个名为iIncident
的接口,它定义了一个方法when()
。 when()
应返回DateTime
个对象。我正在尝试决定如果$object->when()
没有DateTime
返回时该怎么办,就像实例化对象之后以及设置所有属性之前的情况一样。
我的选择是:
Exception
DateTime
,例如'9999-01-01'我倾向于使用Exception
$object
因为DateTime
确实不能作为事件发生,直到它知道它何时发生。我不想返回默认的{{1}},因为它使比较变得复杂,但事实并非如此。而且我真的不想返回false,因为每次调用方法时我都要检查它 - 但如果这是首选方法,我想我会。
抛出异常是最好的方法吗?是否有一个我应该使用的预定义异常类型(没有一个SPL特别适合我 - 但这可能只是表明我缺乏经验)?
答案 0 :(得分:2)
返回null
而不是false
。这是最常见和最自然的方式。是的,你每次都必须检查返回值。
您可以抛出异常,但仅当when()
方法因某些错误或其他原因无法返回DateTime
时才会抛出异常。
答案 1 :(得分:1)
我认为例外是应用程序或服务器的错误。返回虚假日期毫无意义,如果您返回false,则必须每次都进行检查。
解决方案是扩展DateTime
并创建Special Case (496),可能称为DateTimeNone
。
修改:更改 特殊情况
的答案答案 2 :(得分:1)
我是回归虚假自己的粉丝。在“if”条件下,简单地陈述if($object->when() && $object->when()->before($otherdate))
等,而不是返回默认日期(如12/31/1969,即有效日期),这对我来说具有逻辑意义。
答案 3 :(得分:1)
例外情况适用于特殊情况。试图从部分构造的对象中读取/操作是非常特殊的。
如果没有可用的时间戳,代码路径是否有意义?可能不是吗?
抛出(并酌情捕获)异常。
答案 4 :(得分:1)
我认为问题在于您允许在不一致的状态下创建对象。如果对象应该能够创建日期值,那么它应该在其构造函数中而不是通过属性接收它需要执行的所有依赖项。如果这是不可能的,那么您应该考虑尝试通过工厂(或工厂方法)封装构造过程。