1

在循环中的函数调用附近还是在函数调用本身中睡觉更清楚?就我个人而言,我倾向于在通话附近而不是在通话中睡觉,因为“getApple()”没有任何内容暗示它应该在返回苹果之前睡眠一段时间。我认为拥有以下内容会更清楚:

for (int i = 0; i < 10; ++i) {
    得到苹果();
    睡觉()
}

比...

for (int i = 0; i < 10; ++i) {
    得到苹果();
}

苹果getApple() {
    睡眠(1);
    返回新的苹果();
}

当然,如果方法是getAppleSlowly () 之类的,情况就不同了。

请让我知道你的想法。

一些附加信息(也在下面的评论中,请参阅评论):

无需等待即可获得苹果。等待是为了避免对 API 的每分钟查询的速率限制,但如果您只得到一个苹果,则无需休眠。sleep-in-get 方式使得不睡觉就不可能得到一个苹果,即使它是不必要的。但是,它的好处是确保无论如何,方法都可以调用它,而不必担心超过速率限制。但这似乎是重命名为 getAppleSlowly() 的论据。

4

4 回答 4

4

理想是用一种方法做一件事。由于获取苹果和睡觉是两件不同的事情,我同意你的看法,最好让它们成为两种不同的方法。

于 2011-12-28T20:17:05.393 回答
2

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

将来可能会有其他函数调用者不希望它休眠。

于 2011-12-28T20:18:14.483 回答
1

我认为这是一个公平的问题,在一个你可能不知道它存在的方法中放置一个 sleep是非常糟糕的(想象一下,当你忘记你所做的事情时,在几个月内尝试调试应用程序的缓慢性。睡眠应该只在你理解它为什么睡觉的地方(并且大概你有一个很好的理由)。

于 2011-12-28T20:33:50.727 回答
1

这是一个非常有趣的问题,我认为您的两个解决方案都有些缺陷。“getApple(); 睡眠();” 解决方案会迫使每个 getApple() 在处理之前暂停,即使我们永远不会再执行 getApple()。“睡眠();返回新苹果();” 解决方案在我们获得的第一个 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节流”的事情,并让其他一些类完全负责执行它。

于 2011-12-28T21:04:51.490 回答