【问题标题】:Java best practice - doing large math calculations on a single line? [closed]Java 最佳实践 - 在一行上进行大型数学计算? [关闭]
【发布时间】:2015-12-30 23:21:37
【问题描述】:

我想知道声明多个不需要的变量以使我的代码更具可读性是否好。以下哪个 sn-ps 是更好的编码?它计算两个质量之间的力。

    // 1
    double dx = xPos - b.xPos;
    double dy = yPos - b.yPos;
    double r = Math.sqrt(dx*dx + dy*dy);
    double F = G * mass * b.mass / (r*r);

    // 2
    double Fx = G * mass * b.mass / Math.pow( Math.sqrt(Math.pow(2,xPos-b.xPos) + Math.pow(2,yPos-b.yPos)), 2);

如何平衡可读性和性能?用注释在一行中完成所有操作好吗?

(我意识到 Math.pow( Math.sqrt( 在第二个示例中可以删除,但这只是一个示例)

【问题讨论】:

  • 可读的方式进行。我认为选项 1 比选项 2 更具可读性。
  • 总是从为程序员优化开始。只有当您有证据证明存在性能问题时,您才应该尝试针对计算机进行优化。无论如何,任何体面的编译器都会为您的两种选择生成基本相同的代码。
  • 我同意 Elliott 的观点——我怀疑在性能上是否存在任何差异。如果中间变量的名称能够反映它们的含义,那就更好了。在数学公式的情况下,如果短名称与出现在公式中的名称相同,那么它们可能是可以的。但是,当您在业务应用程序中拆分长表达式时,为了便于阅读,尽可能使用有意义的变量名也很有帮助。
  • 您还可以为这些操作定义一个向量类。 (我很高兴在 java 中有值类)

标签: java math code-readability


【解决方案1】:

如何平衡可读性和性能?

您提供了一个很好的例子,说明为什么可读性比性能更重要。

Math.pow(2,xPos-b.xPos)

这是

2^(xPos-b.xPos)

而不是

(xPos-b.xPos)^2

正如我想象的那样。

还有

Math.pow(Math.sqrt(x), 2)

只是

x

无论哪种方式,你的表达方式都太复杂了,你应该简化它。

double dx = xPos - b.xPos;
double dy = yPos - b.yPos;
double F = G * mass * b.mass / (dx*dx + dy*dy);

注意:Math.powMath.sqrt 都是昂贵的操作,因此通过简化公式,它也会更快。

【讨论】:

    【解决方案2】:

    始终以最简单、最易读的方式编写代码(备选方案 1)。您可以使用变量名本身来阐明您的代码。

    如果您需要查看可用变量,它还可以让您稍后更轻松地进行调试。如果你得到一个异常,它会准确地指出失败的指令集,而不是替代方案 2 的巨大而令人困惑的行。

    它不会影响性能,因为 Just In Time 编译器会自动优化您的代码。

    【讨论】:

      【解决方案3】:

      我会选择备选方案 1,因为如果您遇到异常,它会使调试更容易,因为您将每行执行一个操作,并且堆栈跟踪将包括发生错误的行号。我个人也觉得它更容易阅读。我会改变的是你的变量名更有意义。

      【讨论】:

        【解决方案4】:

        如何平衡可读性和性能?正在做这一切 加上评论好吗?

        嗯,我不认为它真的会影响性能。我建议尽可能多地阅读。对冗长的计算公式进行评论并没有多大帮助。

        【讨论】:

          【解决方案5】:

          第一个代码是为了正确,然后是为了清楚起见(当然,这两者通常是相互关联的!)。最后,只有当你有真正需要的真实经验证据时,你才能考虑优化。过早的优化确实是邪恶的。优化几乎总是会花费您的时间、清晰度和可维护性。你最好确保你买的是有价值的东西。

          过早的优化是编程中万恶之源(或至少是大部分)... Donald Knuth

          Should a developer aim for readability or performance first?

          【讨论】:

            【解决方案6】:

            当您声明每个变量时,不仅可以使代码更具可读性,还可以帮助防止错误。在求解方程的不同部分时,声明单个变量也很有用。

            double dx = xPos - b.xPos;
            double dy = yPos - b.yPos;
            double r = Math.sqrt(dx*dx + dy*dy);
            double F = G * mass * b.mass / (r*r);
            

            通过声明每个变量,您可以显示两个对象之间的 x 方向、y 方向、半径和重力的距离。

            压缩成一行的代码通常会令人困惑并导致愚蠢的错误。

            double Fx = G * mass * b.mass / Math.pow( Math.sqrt(Math.pow(2,xPos-b.xPos) + Math.pow(2,yPos-b.yPos)), 2);
            

            【讨论】:

              【解决方案7】:

              不要在一行上写复杂的代码是不行的,想象一下在一个现实生活中的项目中工作,不仅你会改变你的代码,如果你的老板不懂代码,就会造成灾难改变它,如果你有一个,你怎么想知道你的错误来自哪里

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-11-07
                • 1970-01-01
                • 2012-03-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-22
                • 1970-01-01
                相关资源
                最近更新 更多