1

ループ内の関数呼び出しの近くでスリープする方が明確ですか、それとも関数呼び出し自体でスリープする方が明確ですか?個人的には、「getApple()」については、アップルを返す前にある程度の時間スリープする必要があることを意味するものがないため、コールではなくコールの近くでスリープする傾向があります。私はそれが持っている方がより明確だと思います:

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

よりも...

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

Apple getApple(){
    sleep(1);
    新しいApple();を返します。
}

もちろん、これは、メソッドがgetAppleSlowly()などの場合は異なります。

ご意見をお聞かせください。

いくつかの追加情報(以下のコメントにもあります。コメントを参照してください):

リンゴを手に入れるのに待つ必要はありません。待機は、APIへの1分あたりのクエリのレート制限を回避することですが、リンゴを1つしか取得していない場合は、スリープする必要はありません。スリープインゲットの方法では、不要な場合でも、スリープせずにリンゴを入手することは不可能です。ただし、それは、何があっても、メソッドがレート制限を超えることを心配せずにそれを呼び出すことができることを確認できるという利点があります。しかし、それはgetAppleSlowly()に名前を変更するための議論のようです。

4

4 に答える 4

4

理想は、1つの方法で1つのことを実行することです。リンゴを手に入れることと寝ることは2つの異なることなので、私はあなたに同意します。それらを2つの異なる方法にする方がよいでしょう。

于 2011-12-28T20:17:05.393 に答える
2

sleep関数名が遅延があることを示唆していない限り、私は関数自体にを入れません。

将来、関数がスリープすることを期待しない他の呼び出し元が関数に存在する可能性があります。

于 2011-12-28T20:18:14.483 に答える
1

これは公正な質問だと思います。メソッドの中にスリープを入れて、そこにあることを知らない可能性があるのは非常に悪いことです(何をしたかを忘れたときに、数か月以内にアプリケーションの速度をデバッグしようとすると想像してみてください。睡眠は、なぜそれが眠っているのかを理解している場所でのみ行う必要があります(そしておそらくあなたにはそれに対する正当な理由があります)。

于 2011-12-28T20:33:50.727 に答える
1

これは非常に興味深い質問であり、どちらのソリューションにも多少の欠陥があると思います。「getApple(); sleep();」ソリューションでは、getApple()を二度と実行しない場合でも、処理する前に各getApple()を強制的に一時停止する必要があります。「sleep(); return new 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スロットルを回避するためにどのくらいの時間スリープするか」ということ全体を理解し、他のクラスにそれを強制する責任を完全に負わせる傾向があります。

于 2011-12-28T21:04:51.490 に答える