Как оценить булево выражение со многими аргументами? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь настроить проверку состояния для моего кода. Однако код стал длинным и сложным. Мне нужна более простая версия кода, которая может легко выполнить эту работу.

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

if (
    (((userState[0][0]&&userState[0][1])&&(userState[0][2]))) || 
    (((userState[1][0]&&userState[1][1])&&(userState[1][2]))) ||
    (((userState[2][0]&&userState[2][1])&&(userState[2][2]))) ||
    (((userState[0][0]&&userState[1][0])&&(userState[2][0]))) ||
    (((userState[0][1]&&userState[2][1])&&(userState[1][1]))) ||
    (((userState[0][2]&&userState[2][2])&&(userState[1][2]))) ||
    (((userState[0][0]&&userState[2][2])&&(userState[1][1]))) ||
    (((userState[1][2]&&userState[1][1])&&(userState[2][0])))
)

Ответы [ 2 ]

3 голосов
/ 15 июня 2019

Вы можете использовать вложенный цикл:

boolean result;
for (int i = 0; i < userState.length; i++) {
 for (int j = 0; j < userState[i].length; j++) {
  result |= userStage[i][j];
 }
}
1 голос
/ 15 июня 2019

Чистый код предлагает никогда не писать такой код в первую очередь.

Если вообще, вы можете, например, создать небольшие вспомогательные методы для каждой строки, например:

private hasStateConditionXyz(boolean[][] userState) {
  return userState[0][0]&&userState[0][1])&&(userState[0][2];
} 

где "Xyz" будет красивым красивым именем, которое говорит читателю, каково намерение этой проверки.

Конечно, это нарушает вашу способность каким-то образом зацикливать над вашим массивом.

Другими словами:

  • если возможно, посмотрите, возможно ли вычислить ваш результат, зацикливаясь на этом массиве, вместо записи таких ручных «шаблонов»
  • в противном случае рассмотрите возможность использования таких именованных вспомогательных методов

Где, в конце концов, реальный ответ может состоять в том, чтобы сделать шаг назад и посмотреть на общую проблему, которую нужно решить. Значение: если у вас есть такой сложный «конечный автомат», тогда может быть лучше создать конечный автомат. Или использовать какой-то «рабочий процесс» двигателя. Такие инструменты позволяют вам выражать такие сложные (бизнес?) Правила гораздо более краткими и удобочитаемыми способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...