一个朋友和我对单个函数进行了大讨论,函数本身没有任何意义,但在我看来是错误的。
函数如下:
//get tomorrows date
int getTomorrowsDate(){
sleep(1*60*60*24);
return getCurrentDate();
}
Run Code Online (Sandbox Code Playgroud)
如果我执行函数并得到结果,那已经是错误的了,因为明天已经到了今天。
经过长时间的讨论,我的朋友认为函数在执行时间是正确的,而我则相反,并说函数在结果时间是正确的。请有人向我详细说明为什么我的观点是错误的,因为我不明白。
Joh*_*ica 18
正如David Schwartz 所说,获取磁盘可用空间、获取文件大小、检查文件是否存在等状态报告操作从根本上是不可靠的。考虑它们的一个好方法是它们返回善意估计对它们的测量的,但有一个警告,调用者不能依赖于正确的值,因为它们可能在测量之前、之后或期间的任何时间发生变化。
还有要求的问题,无论是声明的还是未声明的。几乎您编写的每个函数都有一个未说明的性能要求,即执行时间不超过 24 小时。当然,约会也是如此。当该函数完全不可用时,你称这个函数的结果有什么关系?这纯粹是学术上的区别。实际上,该功能已损坏,并且没有任何结果是正确的。
更进一步,我什至不确定这是学术上的区别。您在问“执行时间”或“结果时间”是否正确。“正确”意味着区别将导致正确或错误的行为,您需要知道它将是哪个。这些动作会是什么?
如果我是对的,那么我会做X,但如果我的朋友是对的,我会做Y。
什么是动作X和Y?根据这个论点的解决方式,你会怎么做?例如,如果这是票务系统中的一个真正问题,你最终会根据争论的结果来解决这个问题——你们都没有解决 24 小时的睡眠问题吗?我希望不是!
如果状态报告函数的结果在调用和返回之间至少有一次有效,则它的结果是正确的。这适用于所有状态报告功能,例如获取磁盘可用空间、获取文件大小等。
在某些时候,它必须获得状态,并且在获得状态之前或获得状态之后它无法对状态变化做任何事情。所以这必须是规则,否则就不可能编写正确的函数。
人们经常会误会这一点。例如,他们检查磁盘上的可用空间,然后假设后续写入不会因空间不足而失败。或者他们调用select然后假设后续操作不会阻塞。这些都是错误。