我应该采用哪种方法来实现这两个move()函数?

时间:2015-04-28 02:07:51

标签: java algorithm

我正在编写一个小型模拟程序,我有一个void move(int n)函数和一个void move()函数。正如他们的名字所暗示的那样,move(int n)会使n一次移动,而move()只会移动一次。

现在我有两种方法可以实现它们。方法1是:

public void move()
{
  // make one move
}

public void move(int n)
{
  for (int i=0;i<n;i++)
  {
    move();
  }
}

接近2:

public void move(int n)
{
  for (int i=0;i<n;i++)
  {
    // make one move
  }
}

public void move()
{
  move(1);
}

显然,当移动次数很大时,方法2会提高时间效率,因为我们每次移动时都不会进行单独的功能调用。但是,由于现在每个移动的实现都是在for loop中实现的,因此稍后更改实现(例如,从每次移动中获取元数据或分析数据)似乎没有良好的模块性。并且在一次一个地进行多个单个移动的情况下,方法2需要额外的函数调用和额外的循环设置。

假设我们不了解未来的特定用例,我应该如何决定采取哪种方法?

3 个答案:

答案 0 :(得分:1)

实际上,一个好的JVM应该使它们非常相同(主要是内联,见this answer);你应该专注于可读代码,这肯定使第一个更好。如果确实很重要,我建议尝试用随机用例(例如所有单个移动,所有大量移动,混合)来分析您的代码;您可能必须做出一些关于您最有可能查看的定性决策,并且请记住,如果您编写可能被移植的代码,它将依赖于实现。

答案 1 :(得分:1)

也许我错过了一些东西,但看起来你只需要一个功能

public void move(int n)
{
  for (int i=0;i<n;i++)
  {
    // make one move
  }
}

对于只需要进行一次移动的情况,初始化变量i所需的额外时间再做一次比较可以忽略不计。

答案 2 :(得分:0)

我建议您在进行移动时只使用一个功能,无论是一次移动还是多次移动。您应该使用第一种方法并保留void move() private并让void move(int n)调用此函数public