重构两个具有略有不同值的相似if循环(Java)
我有一个函数,它包含两个类似的if语句,很难重构 我之所以这么说是因为这两个版本共享了大量重复代码,但由于与board[startX+1][startY-1]和board[startX-1][startY-1]稍有不同,我发现很难有效地重构它 换句话说,我当然可以通过创建另一个包含公共部分的函数来重构它,但我担心在该函数中再创建几个if循环,从而使代码更脏重构两个具有略有不同值的相似if循环(Java),java,refactoring,Java,Refactoring,我有一个函数,它包含两个类似的if语句,很难重构 我之所以这么说是因为这两个版本共享了大量重复代码,但由于与board[startX+1][startY-1]和board[startX-1][startY-1]稍有不同,我发现很难有效地重构它 换句话说,我当然可以通过创建另一个包含公共部分的函数来重构它,但我担心在该函数中再创建几个if循环,从而使代码更脏 重构这类代码有什么建议吗?只要将乘数变量设置为1或-1,具体取决于哪种方式是“向上”,然后在偏移“X”值时,与该变量相乘即可 我认为,这样的
重构这类代码有什么建议吗?只要将乘数变量设置为
1
或-1
,具体取决于哪种方式是“向上”,然后在偏移“X”值时,与该变量相乘即可
我认为,这样的办法应该行得通:
public boolean hasCapturableEnemy(Piece[][] board, int startX, int startY, int endX, int endY) {
//If the Pawn belong to the Upper Team (Faces downward)
if(board[startX][startY] != null && board[startX][startY].getTeam() == Player.UP) {
//If a Piece exists on a diagonally adjacent tile, return true
if(startX - endX == -1 && Math.abs(startY - endY) == 1) {
if( (board[startX + 1][startY - 1] != null && board[startX + 1][startY - 1].getTeam() != Player.UP) ||
(board[startX + 1][startY + 1] != null && board[startX + 1][startY + 1].getTeam() != Player.UP)) {
return true;
}
}
}
if(board[startX][startY] != null && board[startX][startY].getTeam() == Player.DOWN) {
//If the Pawn belongs to the Down Team (Faces upward)
if(startX - endX == 1 && Math.abs(startY - endY) == 1) {
//If a Piece exists on a diagonally adjacent tile, return true
if( (board[startX - 1][startY - 1] != null && board[startX - 1][startY - 1].getTeam() != Player.DOWN) ||
(board[startX - 1][startY + 1] != null && board[startX - 1][startY + 1].getTeam() != Player.DOWN)) {
return true;
}
}
}
return false;
}
你还可以做一些进一步的重构,在变量中捕获
board[startX+xOffset]
,使事情变得更干净。如果这段代码有效,请继续问。If语句不是循环,你可以对检查进行重新排序,这样你只需检查If(startX-endX==1&&Math.abs(startY-endY)==1){
一次。
if(board[startX][startY] == null) {
return false;
}
Player player = board[startX][startY].getTeam()
int xOffset = player == Player.UP
? 1
: -1;
//If a Piece exists on a diagonally adjacent tile, return true
if(endX - startX == xOffset && Math.abs(startY - endY) == 1) {
if( (board[startX + xOffset][startY - 1] != null && board[startX + xOffset][startY - 1].getTeam() != player) ||
(board[startX + xOffset][startY + 1] != null && board[startX + xOffset][startY + 1].getTeam() != player)) {
return true;
}
}