Вложенные «если» или «а»? - PullRequest
3 голосов
/ 08 июля 2020

Я программист начального уровня, который только начинает работать над реальными проектами, и я начинаю думать о таких вещах, как эффективность и выглядит ли мой код профессионально. Мне было интересно, лучше ли при проверке нескольких логических значений использовать вложенные операторы if или несколько && и || операторы.

Action action = event.getAction();
Material holding = event.getItem().getType();
if((action.equals(Action.RIGHT_CLICK_AIR)||(action.equals(Action.RIGHT_CLICK_BLOCK))))
{
    if((event.hasItem())&&(holding.equals(Material.COMPASS)))
    {
        //if the player right clicked while holding a compass
    }
}

Это правильно? Я попытался сгруппировать подобные if-утверждения вместе. Кроме того, если я могу еще что-нибудь сделать, чтобы улучшить форматирование, пожалуйста, сообщите мне! Спасибо.

Ответы [ 5 ]

2 голосов
/ 08 июля 2020

Добро пожаловать в сообщество Stack Overflow!

Нет проблем с кодом, указанным в вопросе. В некоторых случаях лучше выбрать удобочитаемость, чтобы ваши коллеги могли лучше понять предлагаемый код. Но, в конце концов, это очень субъективно.

ИМХО, легче понять, если мы напишем сразу все условия. Итак,

Action action = event.getAction();
Material holding = event.getItem().getType();

Boolean isRequiredAction = action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)

if (
  isRequiredAction
  && event.hasItem() 
  && holding.equals(Material.COMPASS)
)
{
  // logic...
}

Однако, если вам действительно нужны советы и подсказки о том, как его реорганизовать, а также передовые практики на конкретном языке, попробуйте сообщество Code Review .

1 голос
/ 08 июля 2020

imo для личного вкуса, я бы поместил эти вложенные условия в логическую переменную, которая может объяснить поведение так же, как и комментарий, который вы впустили в блок, например:

boolean isActionRightClick = action.equals(Action.RIGHT_CLICK_AIR ||action.equals(Action.RIGHT_CLICK_BLOCK);

boolean isHoldingACompass = event.hasItem() && holding.equals(Material.COMPASS);

, а затем

if ( isActionRightClick && isHoldingACompass ) {...}
0 голосов
/ 08 июля 2020

Это хорошо, если подумать о качестве / читабельности вашего кода.

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

Но в большинстве случаев будьте осторожны, чтобы не делать слишком много оператора if и пытаться заменить его дизайном паттернов (легче сказать, чем сделать. ). Вы можете найти много этого в java -design-patterns

0 голосов
/ 08 июля 2020

Я думаю, вы могли бы сделать его еще короче, если бы правильно использовали тернарный оператор (?:).

if (expression1) {
    result = 1;
} else if (expression2) {
    result = 2;
} else if (expression3) {
    result = 3;
} else {
    result = 0;
}
result = (expression1) ? 1 : (expression2) ? 2 : (expression3) ? 3 : 0;
0 голосов
/ 08 июля 2020

Да, мне кажется, ваш код очень хорош. Раньше я работал над большими проектами и использовал вложенные операторы if или несколько операторов && и || операторы, что экономит время. В вашем коде эффективность можно проследить по адресу:

if((action.equals(Action.RIGHT_CLICK_AIR)||(action.equals(Action.RIGHT_CLICK_BLOCK))))

Теперь проверьте, что только одно условие в операторе or будет удовлетворять условию if, что сэкономит время, а также сократит длину кода.

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

Для получения дополнительных сведений об эффективном кодировании вы можете посетить эту ссылку: https://docs.oracle.com/cd/E80738_01/pt854pbh2/eng/pt/tpcd/task_WritingMoreEfficientCode-0749ba.html#topofpage

...