Java 最佳实践 - 在一行中进行大量数学计算?

Java best practice - doing large math calculations on a single line?

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

    // 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,因为如果出现异常,它会使调试更容易,因为每行将有一个操作,并且堆栈跟踪将包括发生错误的行号。我个人也觉得它更容易阅读。我会改变的是你的变量名更有意义。

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

如果您需要观察它们,它还可以更轻松地在以后使用可用变量进行调试。如果你得到一个异常,它会精确地指出指令集失败,而不是备选方案 2 的巨大的、令人困惑的行。

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

How do I balance readability and performance? Is doing it all in one line with a comment okay?

嗯,我认为它不会真正影响性能。我建议尽可能多地阅读它。评论一个长计算公式没有多大帮助。

不在一行上写复杂的代码是不行的,想象一下在一个现实生活中的项目中工作,在这个项目中,你不仅要修改你的代码,如果你的老板不说话就不能理解代码,那将导致灾难对它进行更改,如果你有一个

,你怎么想知道你的错误来自哪里

首先是正确性代码,然后是清晰性代码(当然,这两者通常是相关联的!)。最后,只有当你有实际需要的真实经验证据时,你才能考虑优化。过早的优化真的是邪恶的。优化几乎总是会花费您时间、清晰度和可维护性。你最好确定你买的东西物有所值。

Premature optimization is the root of all evil (or at least most of it) in programming... Donald Knuth

Should a developer aim for readability or performance first?

How do I balance readability and performance?

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

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 都是昂贵的操作,因此通过简化公式,它也会更快。

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

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-direction、y-direction 中的距离、半径和两个对象之间的重力。

压缩成一行的代码通常会造成混淆并导致愚蠢的错误。

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