1. ホーム

[解決済み】MongoDB Javaドライバが条件付きで乱数ジェネレータを使用するのはなぜですか?

2022-04-12 23:52:09

質問

で以下のようなコードを見かけました。 このコミット に対して MongoDBのJava接続ドライバ と、一見すると何かの冗談のように見えます。次のコードは何をするものなのでしょうか?

if (!((_ok) ? true : (Math.random() > 0.1))) {
    return res;
}

(編集: コード が更新されたので この質問を投稿する)

解決方法を教えてください。

その行の履歴を調べた結果、私の主な結論は、無能なプログラミングが行われていたことです。

  1. その行は、ありがた迷惑なほど複雑です。一般的な形式は

    a? true : b
    
    

    について boolean a, b は、単純な

    a || b
    
    
  2. 周囲の否定と過剰な括弧が、さらに事態を複雑にしている。念頭に置くのは ド・モルガンの法則 このコード片が次のようになることは些細な観察である。

    if (!_ok && Math.random() <= 0.1)
      return res;
    
    
  3. というコミット は、もともとこのロジックを導入していました。 がありました。

    if (_ok == true) {
      _logger.log( Level.WARNING , "Server seen down: " + _addr, e );
    } else if (Math.random() < 0.1) {
      _logger.log( Level.WARNING , "Server seen down: " + _addr );
    }
    
    

    -も無能なコーディングの一例ですが、このように 逆ロジック : ここでは、イベントがログに記録されるのは _ok のコードでは、10%のケースで、またはそれ以外のケースで使用されます。 リターン 10%の確率で、90%の確率でログを記録します。つまり、後のコミットはわかりやすさだけでなく、正しさそのものを台無しにしてしまったのです。

    投稿されたコードを見ると、作者がどのようにオリジナルの if-then で必要な否定に文字どおり変換します。 return という条件です。しかしその後、彼は失敗し、不等号を逆にすることで効果的な「二重否定」を挿入してしまった。

  4. コーディングスタイルの問題はさておき、ストキャスティック・ロギングというのは、それ自体かなり怪しい行為です。特に、ログ・エントリがそれ自身の特異な動作を記録していないのですから。その意図は、明らかに、サーバーが現在ダウンしているという同じ事実の再記述を減らすことです。適切な解決策は 変更 サーバーの状態を観察し、その観察結果ごとに、あるいはそのような観察結果の10%からランダムに選択するのではありません。そう、これはほんの少し手間がかかるので、少し見てみましょう。

を検査して蓄積された無能の証拠が、このような形で現れることを願うばかりです。 たった3行のコード そして、この作品は早急にクリーンアップされることでしょう。