如何组合两个具有相同计算但操作(读取和写入)类的不同字段的方法。 一个非常简化的空气码示例:
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 :(得分:1)
不,我不会合并它们,我会改变它们。
如,
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,您将能够使用闭包,这将大大简化这种情况。