如何将两个方法结合使用相同的计算但不同的字段

时间:2013-11-28 14:32:39

标签: java

如何组合两个具有相同计算但操作(读取和写入)类的不同字段的方法。 一个非常简化的空气码示例:

class TileCalculator 
{
  int length;
  int width;
  int tileLength;
  int tileWidth
  int cols;
  int rows;

  void calculateColumns() 
  {
    this.cols = this.width/this.tileWidth;
  }

  void calculateRows() 
  {
    this.rows = this.length/this.tileLength;
  }

}

由于这两种方法的计算完全相同,但只是使用不同的字段进行输入和输出,因此将它们组合起来似乎是明智的,但我不知道如何。

更新:我想我可能已经过度简化,以至于回答者正试图解决具体案件。一个更现实的例子是:

void calculateCols()
{
  int tileCols = width/tileWidth;
  int remainder = width%tileWidth;
  if (remainder==0) {
    // there is an exact number of whole tiles
    fullTileCols = tileCols;
    firstT = tileWidth;
    usedTileCols = tileCols;
  } else {
    // there is a remainder
    fullTileCols = tileCols - 1;
    firstT = (remainder+tileWidth)/2;
    usedTileCols = tileCols + 1;
  }
}

void calculateRows() 
{
  int tileRows = length/tileLength;
  int remainder = length%tileLength;
  if (remainder==0) {
    // there is an exact number of whole tiles
    fullTileRows = tileRows;
    firstCut = tileLength;
    usedTileRows = tileRows;
  } else {
    // there is a remainder
    fullTileRows = tileRows - 1;
    firstCut = (remainder+tileLength)/2;
    usedTileRows = tileRows + 1;
  }
}

我并不是说重新设计不是答案,但正如您所看到的那样,涉及多个字段,因此简单的return值可能不会削减它。这就是我使用字段而不是简单函数的原因,而且当前设置的可维护性是我所关注的。

3 个答案:

答案 0 :(得分:1)

不,我不会合并它们,我会改变它们。

  • 我会删除行和列字段
  • 我将摆脱上述方法,因为它会使对象的状态依赖于这些方法始终在使用对象之前被调用 - 这是一个冒险的命题。
  • 相反,我会创建两个计算的getter方法。这样,计算保证在需要时完成。

如,

public int getColumns() {
  return width / tileWidth;
} 

public int getRows() {
  return length / tileLength;
}

修改

我想你可以创建一个RowCol类,它包含完整的,第一个和使用过的字段,并且只有一个等式用于上面的计算,并且你创建了两个实例,一个用于行,一个用于包含在列中的列但是,如果基本原理只是将这些小方法结合起来,我就会质疑这种方法的必要性或好处。是的,您应该遵循DNRY规则,但是当我有三个或更多相同代码的重复时,我会更加担心这一点。

答案 1 :(得分:1)

你可以做一个方便的方法。如果您已经证明这实际上是更多的打字,更长的程序,额外的复杂性等没有任何好处。但如果计算更复杂,那就值得了。

    int calculate(int a, int b) 
      {
        return a/b;
      }

    void calculateColumns() 
      {
        this.cols = this.calculate(this.width, this.tileWidth);
      }
更新后

你实际上想要3个返回值(完整,第一,使用),所以改变"计算"要么返回一个带有3个int的特殊类,要么返回一个int

数组

然后像以前一样输入a和b但是使用调整后的逻辑并返回3个值并在调用函数中设置它们

答案 2 :(得分:0)

在Java 8之前,没有简单的方法可以在Java中执行此操作。您可以这样做,但它涉及使用私有内部接口和匿名类。除非你真的在讨论很多常见的代码行,否则它是不值得的。

但是,使用Java 8,您将能够使用闭包,这将大大简化这种情况。