在循环中的函数调用或函数调用本身附近睡觉是否更清楚?

时间:2011-12-28 20:15:25

标签: java multithreading coding-style thread-sleep

在循环或函数调用本身的函数调用附近睡觉是否更清楚?我个人倾向于在呼叫附近而不是在呼叫中睡觉,因为“getApple()”没有任何暗示它应该在返回苹果之前睡一段时间。我认为更清楚:

for ( int i = 0; i < 10; ++i ) {
    getApple();
    sleep()
}

...比

for ( int i = 0; i < 10; ++i ) {
    getApple();
}

Apple getApple() {
    sleep(1);
    return new Apple();
}

当然,如果方法是 getAppleSlowly ()或其他什么,这会有所不同。

请让我知道你的想法。

一些其他信息(也在下面的评论中,见评论):

获得一个苹果不需要等待。等待是为了避免每分钟对API的查询速率限制,但如果你只获得一个苹果,则没有必要睡觉。即使没有必要,睡不着也不可能在没有睡觉的情况下获得苹果。但是,它的好处是确保无论如何,方法都可以调用它而不必担心超过速率限制。但这似乎是重命名为getAppleSlowly()的论据。

4 个答案:

答案 0 :(得分:4)

理想的是一种方法做一件事。因为吃苹果和睡觉是两回事,我同意你的观点,最好让它们成为两种不同的方法。

答案 1 :(得分:2)

只要函数名称不表示会有延迟,我就不会将sleep放入函数本身。

将来可能还有其他呼叫者不希望它睡觉。

答案 2 :(得分:1)

我认为这是一个公平的问题,在一个你可能不知道它的方法中睡一觉非常很糟糕(想象一下在一些方法中调试你的应用程序的缓慢几个月你忘记了你做了什么。睡眠应该只是在你理解为什么它在睡觉的地方(并且可能你有充分的理由)。

答案 3 :(得分:1)

这是一个非常有趣的问题,我认为你的两个解决方案都存在一些缺陷。 “getApple(); sleep();”解决方案会因为强制每个getApple()在处理之前暂停,即使我们再也不会执行getApple()。 “sleep();返回新Apple();”解决方案在我们获得的第一个Apple上有类似的开销。最佳解决方案就像是。

for ( int i = 0; i < 10; ++i ) {
    getApple();
}

Apple getApple() {
    long sleepTime = needToSleep();
    if ( sleepTime > 0 ) {
      sleep(sleepTime);
    }
    return new Apple();
}

/**
 * Checks if last query was made less than THRESHOLD ago and 
 * returns the difference in millis that we need to sleep.
 */
long needToSleep() {
    return ( lastQueryInMillis + THRESHOLD ) - System.currentTimeInMillis();
}

我倾向于将整个“我睡多久以避免API节流”的事情放在某些界面背后,并让其他一些人全权负责执行它。