Консолидация нескольких операторов if - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть следующий код, который опирается на несколько различных операторов if.Я делаю приложение подсчета очков Криббедж для Android.Показанный код предназначен только для команды Blue, но все, что я в итоге получу для команды Blue, будет использоваться и для команд красного и зеленого цветов.То, что у меня сейчас работает, но громоздко.Я новичок в java и надеялся получить несколько советов по передовым методам консолидации кода, чтобы его было легче читать и поддерживать.

    if(blueTeamScore >= ENDGAMESCORE) {
        String baseVictoryText = "Blue Team has won!";
        TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);

        if(hasThreePlayer == false) {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk == true) {
                if (redTeamScore <= 90) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
            }
        }
        if(hasThreePlayer == true) {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk == true) {
                if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red and Green Teams got Skunked");
                }
                if ((redTeamScore <= 90) && (greenTeamScore >= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
                if ((redTeamScore >= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Green Team got Skunked");
                }
            }
        }
    }

Я знаю, что булевы переменные нельзя использовать в выражениях switch (слишком плохо), но есть ли что-то похожее, что помогло бы сконцентрировать мой код?

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

Я все еще считаю себя довольно новым, но вот что я написал бы.Я редактировал это несколько раз.

if (hasSkunk) {
    if (!hasThreePlayer) {
        if (redTeamScore<=90) {
            baseVictoryText += "\nAnd Red Team got Skunked";
        }
    } else {
        if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
            baseVictoryText += "\nAnd Red and Green Teams got Skunked";
        } else if (redTeamScore <= 90) {
            baseVictoryText += "\nAnd Red Team got Skunked";
        } else if (greenTeamScore <= 90) {
            baseVictoryText += "\nAnd Green Team got Skunked";
        }
    }
}
winningTeamTextView.setText(baseVictoryText);

Предполагая, что вы не возражаете против изменения baseVictoryText (не константа).В противном случае присвойте его чему-то другому и используйте это

Не предполагая, что hasSkunk означает, что хотя бы у одной из команд есть <90, в противном случае последняя остальная часть, если становится else ... </p>

'Иначе, если 'здесь лучше в теории из-за производительности - ifs оцениваются только до тех пор, пока одно из них не будет истинным.Здесь это не проблема, но если одно из условий является результатом здоровенного метода ...

Куча Else Ifs, подобных этому, очень похожа на switch с break.

1 голос
/ 29 сентября 2019

Можно попробовать троичные операторы?:.Пример в приведенном выше коде я только что упростил некоторые части.Вы можете попробовать что-то подобное в другом

        if(!hasThreePlayer) {
            winningTeamTextView.setText(hasSkunk&&redTeamScore<=90 ? baseVictoryText + "\nAnd Red Team got Skunked" : baseVictoryText);
        }
        else {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk) {
                if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red and Green Teams got Skunked");
                }
                if ((redTeamScore <= 90) && (greenTeamScore >= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
                if ((redTeamScore >= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Green Team got Skunked");
                }
            }
        }
0 голосов
/ 29 сентября 2019

Немного чище, так как нужно только установить textField в одном месте, не нужно == логическое значение, если оно должно быть разветвленным, потому что, если один из них удастся, другой потерпит неудачу.небольшое изменение первоначального ответа.

if(blueTeamScore >= ENDGAMESCORE) {
    String victoryText = "Blue Team has won!";

    if(!hasThreePlayer && hasSkunk && redTeamScore <= 90) {
        victoryText += "\nAnd Red Team got Skunked");

    }else if(hasThreePlayer && hasSkunk) {
       if (redTeamScore <= 90 && greenTeamScore <= 90) {
          victoryText +=  "\nAnd Red and Green Teams got Skunked";
       }else if (redTeamScore <= 90) {
          victoryText +=  "\nAnd Red Team got Skunked";
       }else if (greenTeamScore <= 90) {
          victoryText += "\nAnd Green Team got Skunked";
       }
    }

    TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);
    //maybe check for null textfield here?
    winningTeamTextView.setText(victoryText);
}

но я бы выбил функцию

 if(blueTeamScore >= ENDGAMESCORE) {
    String victoryText = "Blue Team has won!";
    if(hasSkunk){
        victoryText += getSkunkText(hasThreePlayer, redTeamScore, greenTeamScore)
    }

    TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);
    //maybe check for null textfield here?
    winningTeamTextView.setText(victoryText);
}

Функция:

private String getSkunkText(boolean hasThreePlayer, int redTeamScore, int greenTeamScore){
    String skunkText  = ""
    if(!hasThreePlayer) {
        skunkText = redTeamScore <= 90 ? "\nAnd Red Team got Skunked") : skunkText;
    }else if (redTeamScore <= 90 && greenTeamScore <= 90) {
        skunkText =  "\nAnd Red and Green Teams got Skunked";
    }else if ( redTeamScore <= 90) {
        skunkText =  "\nAnd Red Team got Skunked";
    }else if (greenTeamScore <= 90) {
        skunkText = "\nAnd Green Team got Skunked";
    }
    return skunkText; 
}
...