Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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
Java 将赋值语句放在if语句中是一种糟糕的做法吗?_Java_Variable Assignment - Fatal编程技术网

Java 将赋值语句放在if语句中是一种糟糕的做法吗?

Java 将赋值语句放在if语句中是一种糟糕的做法吗?,java,variable-assignment,Java,Variable Assignment,基于下面的代码片段(为了清晰起见,它们已被缩短) scoreBoardState方法的目的是在minimax算法中确定叶节点处游戏状态的分数,该分数将被传递以确定AI的最佳移动 hastreeinarow和twoopenspaces\u Horizontal是许多类似的方法之一,由scoreBoardState调用,以确定是否满足某些条件(例如一个玩家一行有3个令牌)。如果为真,则返回满足该条件的玩家数量,然后增加该玩家(人类玩家或AI)的分数 需要在if语句中调用该方法,以检查返回的值是否为零

基于下面的代码片段(为了清晰起见,它们已被缩短)

scoreBoardState
方法的目的是在minimax算法中确定叶节点处游戏状态的分数,该分数将被传递以确定AI的最佳移动

hastreeinarow和twoopenspaces\u Horizontal
是许多类似的方法之一,由
scoreBoardState
调用,以确定是否满足某些条件(例如一个玩家一行有3个令牌)。如果为真,则返回满足该条件的玩家数量,然后增加该玩家(人类玩家或AI)的分数

需要在if语句中调用该方法,以检查返回的值是否为零(这意味着应该添加一些分数)。我可以在if语句中设置该方法返回的值(我在代码段中这样做了),也可以在该方法不返回0的情况下再次调用该方法,然后将其设置到变量中。显然,第二种方法效率较低,但它更具可读性,更容易注意到正在发生的事情

问题是,设置if语句中调用的方法返回的变量是否被认为是错误的做法?还是因为效率更高,所以还可以

注意:第二种方法的低效率增长相当快,因为它在for循环中,并且这种情况会在测试每个条件时多次出现。在minimax算法中,每个叶节点也可以这样做(每个节点可以有7个分支),这意味着深度只有3个(我使用的最小值),有343个叶节点,而深度为7个(我当前使用的最大值),几乎有825000个叶节点

/* scores the board state of a root node in a minimax algorithm
 * @gameState a 2 dimensional array that stores values for each space on the 
 * board. Stores 0 for empty or 1 or 2 if position is taken by a player
 */
int scoreBoardState (int[][] boardState) {

    int aiScore = 0;
    int playerScore = 0;

    int player = -1;

    for (int i = 0; i < boardState.length; i++) {
        for (int j = 0; j < boardState[i].length - 4; j++) {
            if (j < boardState[i].length - 5 && (player = hasThreeInARowAndTwoOpenSpaces_Horizontal(boardState, i, j)) != 0) {

                if (player == AI)   
                    aiScore += 1000; //magic number entered for clarity
                else if (player == PLAYER)
                    playerScore += 1000;

            }
            else if (i < boardState.length - 4 && j > 2 && (player = hasThreeInARowAndOneOpenSpace_Diagonal_UpperRightToLowerLeft(boardState, i, j)) != 0) {

                if (player == AI)   
                    aiScore += SCORE_THREE_IAR_ONE_OS;
                else if (player == PL)  
                    playerScore += SCORE_THREE_IAR_ONE_OS;
            }

        }

    }    

    return aiScore - playerScore;
}

/*
 * checks if, starting from the passed in coordinates, whether there are 3 
 * spaces taken by the same player with an empty space on either side in a horizontal direction (left to right).
 *
 * returns the player number if the result is true. returns 0 if the result 
 *is false or all spaces are empty
 */
int hasThreeInARowAndTwoOpenSpaces_Horizontal(int[][] boardState, int row, int col) {
    if (boardState[row][col] == 0
        && boardState[row][col + 1] == boardState[row][col + 2] && boardState[row][col + 2] == boardState[row][col + 3] 
        && boardState[row][col + 4] == 0) 
    {
        return boardState[row][col + 1];
    }

    return 0;
}
/*在minimax算法中对根节点的板状态进行评分
*@gameState一个二维数组,用于存储计算机上每个空格的值
*董事会。将0存储为空,或将1或2存储为由玩家占据的位置
*/
int scoreBoardState(int[]boardState){
int aiScore=0;
int playerScore=0;
int player=-1;
对于(int i=0;i2&(player=hastreeinarowandoneopenspace\u Diagonal\u upperright tolowerleft(boardState,i,j))!=0){
如果(玩家==AI)
aiScore+=得分三分一分;
else if(player==PL)
playerScore+=得分3分1分;
}
}
}    
返回aiScore-playerScore;
}
/*
*从传入的坐标开始检查是否有3个
*同一玩家在水平方向(从左到右)两侧各有一个空白的空格。
*
*如果结果为真,则返回播放器编号。如果结果为0,则返回0
*为false或所有空格均为空
*/
int有三个inarow和两个openspaces_水平(int[][]boardState,int row,int col){
如果(boardState[行][列]==0
&&boardState[行][col+1]==boardState[行][col+2]&&boardState[行][col+2]==boardState[行][col+3]
&&boardState[行][col+4]==0)
{
返回boardState[行][col+1];
}
返回0;
}

阅读代码的任何人都可能会意外发现它,这使得代码更难支持。这通常是一件值得避免的事情

在这两种情况下,如果要避免性能成本,则可以将条件修改为嵌套条件。因此,与此相反:

if (j < boardState[i].length - 5 && (player = hasThreeInARowAndTwoOpenSpaces_Horizontal(boardState, i, j)) != 0) {
if(j
您可能会有这样的情况:

if (j < boardState[i].length - 5) {
    player = hasThreeInARowAndTwoOpenSpaces_Horizontal(boardState, i, j);
    if (player != 0) {
if(j
这样,操作的性能损失仍然只会在原始代码中出现。但是,操作的存在及其随后对局部变量的赋值变得更加明显。任何浏览代码的人都可以立即看到发生了什么,尽管只需很少的操作t

这里的好处是条件本身非常清晰和简洁。进行长时间的条件比较会使代码很难理解,但简单的比较很简单


这里的缺点是你正在创建嵌套的条件句。人们往往不喜欢这些。(虽然在这种情况下,我个人的观点是,这是两个弊病中较小的一个。)但如果可读性更好的话,可以通过将每个条件内部的操作重构为它们自己恰当命名的方法来解决这一问题。

我不会说这是一种不好的做法。只要使用正确。在您的情况下,用法是好的,因为在需要变量之前需要满足一个有效的条件在上面的方法中,它是一个或另一个选项,你可以考虑使用下面的内容,但这只是个人的爱好:

条件?真值:假值
if语句的使用很好,只要它们与else语句一起使用,以阻止额外的if语句被执行,那么一切都很好。

请在My 2?上发布此消息。您的
if
语句已经很长了;添加赋值语句对可读性并没有多大帮助,而有一些语句可以赋值在
if