2013-11-28 34 views
1

如何组合两个具有相同计算但运行(读取和写入)类的不同字段的方法。 一个非常简化的aircode例如:如何将两种方法结合在一起计算但字段不同

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值大概是不会削减它的多个领域。这就是为什么我使用字段而不是简单的函数,而且当前设置的可维护性是我关心的。

+0

如果您的公式是要复杂得多,你可以定义一个表示数学的方法matical函数并传递参数。现在,这真的不值得。 – Zong

+1

只需创建第三个函数并传递将结果存储为参数的位置。 – Babblo

+0

@宗正立计算更复杂,有多个返回值。请参阅更新的示例。 – Caltor

回答

1

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

  • 我摆脱行列数场
  • 我摆脱上面的方法,因为它使依赖于这些方法总是你对象的状态所使用的对象之前被调用的 - 一个冒险的主张。
  • 相反,我会创建两个计算得到的getter方法。这样的计算是保证需要时完成。

例如,

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

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

编辑

我想你可以创建一个具有充分,第一,并使用字段RowCol类,并具有但是对于一个方程做上面的计算,并且创建两个实例,一个用于行,一个用于包含类中的列,但如果基本原理是将这些小方法组合起来,那么我质疑需要为此,或者利益。是的,你应该遵循DNRY规则,但当我有三次或更多的相同代码重复时,我更担心这一点。

+0

计算更复杂,并有多个返回值。请参阅更新的示例。 – Caltor

0

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

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

+0

我以前没有使用过闭包。你知道Java 8和闭包是否可以与Android开发一起使用? – Caltor

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个值,并将它们设置在调用函数

+0

计算更复杂,并且有多个返回值。请参阅更新的示例。 – Caltor

相关问题