作为一个行业,我们一直在追求节省一些字节的过程中目光短浅和专断,例如
99年12月31日
- 2038年1月19日
- T + 50年,希望我所参与的所有系统都已经过时或已被替换(或者我死了,以先到者为准)。
恕我直言,最好的选择是在“最大日期”上保持适当的主流抽象水平,并希望有一个通用的解决方案在时间到来之前解决该问题。
例如在.NET中,DateTime.MaxValue是任意的23:59:59.9999999, December 31, 9999, exactly one 100-nanosecond tick before 00:00:00, January 1, 10000
。因此,如果我对自己的寿命的假设是错误的,并且在10000年到来,我宁愿希望使用更高版本的框架重新编译应用程序DateTime.MaxValue
(例如,通过更改其基础类型)到新的任意值并将问题进一步拖延了数千年。
编辑
(加强tdammers的观点是,比伪造一个人工日期更有意义的是,向消费者明确强调我们没有结束日期这一事实。)
作为使用的替代方法null
,其负面影响是与任何引用类型(包括.Net Nullable`)兼容,这可能会导致忘记使用FP语言进行检查的消费者产生NRE问题。Option或Maybe在可能返回或可能不返回的值周围键入包装。
伪代码:
Option<DateTime> LeaseExpiryDate(Home rental)
{
if (... expiry date can be determined ...)
return Some(rental.ExpiryDate);
else
return None;
}
这样做的好处是,它迫使消费者对这两种情况进行推理。模式匹配在这里也很常见:
LeaseExpiryDate(myHome) match {
case Some(expiryDate) => "Expired"
case None => "No Expiry"
}