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

时间:2015-12-30 23:21:38

标签: java math code-readability

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

function drawChart() {
    var data = google.visualization.arrayToDataTable([
      ['Year', 'Sales', 'Expenses'],
      ['2004',  1000,      400],
      ['2005',  1170,      460],
      ['2006',  660,       1120],
      ['2007',  1030,      540]
    ]);

    var options = {
      title: 'Company Performance',
      curveType: 'function',
      legend: { position: 'bottom' }
    };

    var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));

    chart.draw(data, options);
  }

如何平衡可读性和性能?是否可以在评论中一行完成这一切?

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

7 个答案:

答案 0 :(得分:5)

  

如何平衡可读性和性能?

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

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

答案 1 :(得分:3)

始终以简单,最易读的方式编写代码(替代方案1)。您可以使用变量名称来阐明您的代码。

如果您需要观察它们,还可以使用可用变量更轻松地进行调试。如果你得到一个异常,那么它将精确地指出一组指令失败,而不是另一个巨大的,令人困惑的替代方案2。

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

答案 2 :(得分:1)

我会选择替代方案1,因为如果你得到一个例外,它会使调试变得更容易,因为每行会有一个操作,堆栈跟踪将包含发生错误的行号。我个人也觉得它更容易阅读。我想改变的是你的变量名称更有意义。

答案 3 :(得分:1)

  

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

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

答案 4 :(得分:1)

正确性的第一个代码,然后为了清楚起见(当然,这两个经常连接!)。最后,只有你有真正需要的实证证据,你才能看到优化。过早的优化确实是邪恶的。优化几乎总是花费您的时间,清晰度和可维护性。你最好确定你买的是有价值的东西。

  

过早优化是编程中所有邪恶(或至少大部分)的根源...... Donald Knuth

Should a developer aim for readability or performance first?

答案 5 :(得分:1)

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

submit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent returnIntent = new Intent();
        returnIntent.putExtra("BMP", bmp);
        setResult(Activity.RESULT_OK, returnIntent);
        finish();

    }
});

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

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

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);

答案 6 :(得分:0)

没有在一行上编写复杂的代码是不行的,想象一下在一个现实生活的项目中工作,不仅你将对你的代码进行更改,如果可能是你的老板无法理解代码,那么会造成灾难更改它,如果你有一个

,你甚至想知道你的错误来自哪里