Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重构两个具有略有不同值的相似if循环(Java)_Java_Refactoring - Fatal编程技术网

重构两个具有略有不同值的相似if循环(Java)

重构两个具有略有不同值的相似if循环(Java),java,refactoring,Java,Refactoring,我有一个函数,它包含两个类似的if语句,很难重构 我之所以这么说是因为这两个版本共享了大量重复代码,但由于与board[startX+1][startY-1]和board[startX-1][startY-1]稍有不同,我发现很难有效地重构它 换句话说,我当然可以通过创建另一个包含公共部分的函数来重构它,但我担心在该函数中再创建几个if循环,从而使代码更脏 重构这类代码有什么建议吗?只要将乘数变量设置为1或-1,具体取决于哪种方式是“向上”,然后在偏移“X”值时,与该变量相乘即可 我认为,这样的

我有一个函数,它包含两个类似的if语句,很难重构

我之所以这么说是因为这两个版本共享了大量重复代码,但由于与board[startX+1][startY-1]和board[startX-1][startY-1]稍有不同,我发现很难有效地重构它

换句话说,我当然可以通过创建另一个包含公共部分的函数来重构它,但我担心在该函数中再创建几个if循环,从而使代码更脏


重构这类代码有什么建议吗?

只要将乘数变量设置为
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;
    }
}