2011-12-28 9 views
1

ループ内の関数呼び出しの近くで、または関数呼び出し自体の中でスリープ状態になるのは明確ですか?個人的には、コールよりもむしろコールの近くで寝る方がいいです。なぜならアップルを返す前にある程度の時間スリープ状態になることを意味する "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に対する1分あたりのクエリのレート制限を避けることですが、リンゴを1つだけ取得する場合はスリープする必要はありません。睡眠中の方法では、たとえ不要であっても、睡眠を取らずにリンゴを得ることは不可能です。ただし、レート制限を超えることを心配することなく、どのような方法でも呼び出すことができるというメリットがあります。しかし、これはgetAppleSlowly()への名前変更の議論のようです。

+3

これは依存します。なぜあなたは眠っていますか? –

+2

決して決して眠ることは一切ありません! –

+1

これは主観的な質問ですので、SOにはあまり適していません。 –

答えて

2

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

今後この機能を呼び出す人がいて、眠るとは思わないかもしれません。

4

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

+2

これも私が考えていることですが、私はあなたが "別のクエリを送信するのは早すぎますか"を管理し、getApple()で何らかの理由でそれを利用可能にする他のすべてのクラスが必要だと思います。これをAppleMakerインターフェイスに置き、テスト用ではない生産用の実装と実装用のThrottlesを実装します。 Voila ...最高のソリューション。 –

1

私はこれが公正な質問だと思うし、非常にあなたがそこにいるかわからないかもしれない方法の中に眠るのが悪い(数ヶ月であなたのアプリケーションの遅さをデバッグしようと想像している

1

これは非常に興味深い質問です。あなたの解決策の両方には多少の欠陥があると私は思っています(訳注:私はあなたの睡眠を忘れています)。 "getApple(); sleep();"という解決策は、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のスロットルを避けるために眠るどのくらいやる」事を取得し、それを実施するためのいくつかの他のクラスは、完全に責任を作るために傾斜だろう。

関連する問題