执行时间或结果时间是否正确?

sna*_*apo 17 c

一个朋友和我对单个函数进行了大讨论,函数本身没有任何意义,但在我看来是错误的。

函数如下:

//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

什么是动作XY?根据这个论点的解决方式,你会怎么做?例如,如果这是票务系统中的一个真正问题,你最终会根据争论的结果来解决这个问题——你们都没有解决 24 小时的睡眠问题吗?我希望不是!

  • 该死,我本来希望添加“几乎”可以防止那个特定的小虫被选中。 (4认同)
  • 我是说这个函数是可用的,这里唯一的问题是它的命名。或者我完全没有抓住要点。将其命名为“Wait24HrsAndReturnTheDate”,问题就消失了。 (2认同)

Dav*_*rtz 8

如果状态报告函数的结果在调用和返回之间至少有一次有效,则它的结果是正确的。这适用于所有状态报告功能,例如获取磁盘可用空间、获取文件大小等。

在某些时候,它必须获得状态,并且在获得状态之前或获得状态之后它无法对状态变化做任何事情。所以这必须是规则,否则就不可能编写正确的函数。

人们经常会误会这一点。例如,他们检查磁盘上的可用空间,然后假设后续写入不会因空间不足而失败。或者他们调用select然后假设后续操作不会阻塞。这些都是错误。

  • @DavidSchwartz正如OP已经在上一篇中指出的那样。评论,如果您更多地关注给定的示例而不是在这里如此通用,那确实会更好。只是我个人的想法。 (2认同)