java - 为什么 MongoDB Java 驱动程序在条件中使用随机数生成器?

我在 this commit 中看到了以下代码对于 MongoDB's Java Connection driver , 乍一看似乎是某种玩笑。下面的代码是做什么的?

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

(编辑:代码 has been updated since 发布此问题)

最佳答案

在检查了该行的历史之后,我的主要结论是工作中存在一些不称职的编程。

  1. 那条线无缘无故地令人费解。一般形式

    a? true : b
    

    对于boolean a,b等价于简单

    a || b
    
  2. 周围的否定和过多的括号使事情进一步复杂化。牢记De Morgan's laws这是一个微不足道的观察,这段代码相当于

    if (!_ok && Math.random() <= 0.1)
      return res;
    
  3. originally introduced this logic 的提交有

    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% 的其他情况下记录事件,而代码在2. 返回 10% 的时间并记录 90% 的时间。所以后来的提交不仅破坏了清晰度,而且破坏了正确性本身。

    我认为在您发布的代码中,我们实际上可以看到作者打算如何将原始 if-then 以某种方式从字面上转换为早期 return 所需的否定健康)状况。但后来他搞砸了,通过反转不等号插入了一个有效的“双重否定”。

  4. 抛开编码风格问题不谈,随机日志本身就是一种非常可疑的做法,尤其是因为日志条目没有记录其自身的特殊行为。显然,其目的是减少对同一事实的重述:服务器当前已关闭。适当的解决方案是仅记录服务器状态的更改,而不是每个观察结果,更不用说随机选择 10% 的此类观察结果。是的,这需要更多的努力,所以让我们来看看。

我只能希望所有这些从检查仅三行代码中积累的无能证据不能公平地说明整个项目,并且这项工作将得到清理尽快起来。

https://stackoverflow.com/questions/16833100/

相关文章:

mongodb - 如何在 Node.js 中使用 Mongoose 进行分页?

mongodb - 如何在 MongoDB 中将集合从一个数据库复制到另一个数据库

node.js - E11000 mongodb mongoose 中的重复键错误索引

node.js - 通过将 useNewUrlParser 设置为 true 来避免 "curren

mongodb - 如何更新文档数组中的对象(嵌套更新)

mongodb - 无法创建/打开锁定文件 :/data/mongod. lock errno:13

mongodb - 如何将 MongoDB 作为 Windows 服务运行?

node.js - 阻止 Mongoose 为子文档数组项创建 _id 属性

mongodb - Redis 比 mongoDB 快多少?

mongodb - 如何重命名 MongoDB 中所有文档的字段?