abler98
@abler98
Software Engineer

Немного о правильности написания кода. Какой вариант выбрать?

Допустим, имеется такой обработчик нажатий:
@Override
    public void onButtonClick() {
        if (isRequested()) {
            if (rulesField.isChecked()) {
                register(numberField.getText().toString(), codeField.getText().toString());
            } else {
                showMessage(R.string.error_rules);
            }
        } else {
            requestRegister(numberField.getText().toString());
        }
    }


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

Предлагали такой вариант:
@Override
    public void onButtonClick() {
        if (isRequested() && rulesField.isChecked()) {
            register(numberField.getText().toString(), codeField.getText().toString());
            return;
        }
        if (isRequested() && !rulesField.isChecked()) {
            showMessage(R.string.error_rules);
            return;
        }
        if (!isRequested()) {
            requestRegister(numberField.getText().toString());
        }
    }


Как по вашему мнению лучше писать? Или вообще без разницы?

P.S. #1: Привёл пример небольшой конструкции, условий может быть больше.
P.S. #2: Вопрос может и глупый, но меня он почему-то беспокоит :)
  • Вопрос задан
  • 401 просмотр
Решения вопроса 1
artemgapchenko
@artemgapchenko
Много уровней вложенности плохо читаются. Попробуйте добавить внутрь условия

if (rulesField.isChecked()) {
    register(numberField.getText().toString(), codeField.getText().toString());
}

Ещё парочку вложенных if-else, чтобы получилось вот такое:

@Override
    public void onButtonClick() {
        if (isRequested()) {
            if (rulesField.isChecked()) {
                    if (canProceed()) {
                         register(numberField.getText().toString(), codeField.getText().toString());
                    } else if (isExtraRequestRequired()) {
                        doSomething();
                     } else if (oneMoreCondition()) {
                         doSmomethingOnExtraCondition();
                     } else {
                          Log.e("Unexpected condition");
                     }
            } else {
                showMessage(R.string.error_rules);
            }
        } else {
            requestRegister(numberField.getText().toString());
        }
    }

и вы поймёте, что удерживать в голове ту ветку, которая вам интересна (сначала if, потом вложенный в него else, потом второй if-else из вложенных в else первого if'а) становится решительно невозможно. Поэтому и стараются так структурировать код, чтобы он был "плоским", то есть без вложенности. Это, конечно идеал, и иногда труднодостижимый, но стремиться к нему стоит - человек, который после вас будет читать ваш листинг (а чаще всего это будете вы сами недели через две после того, как вы его написали, и успешно забыли всю структуру), скажет вам спасибо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Tiberal
то, что предложили хуже

isRequested() = false -> 3 раза дернется if

в вашем случае один раз

ну и второй вариант плохочитаем

если совсем много вложений switch в помощь
Ответ написан
anton_lazarev
@anton_lazarev
Первый вариант, рано или поздно, может превратиться в:
hM9ycd7.png
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Вариант для отвeта Ivan Sokolov
if (!isRequested()) {
 requestRegister(numberField.getText().toString());
 return;
}

if (rulesField.isChecked()) {
    register(numberField.getText().toString(), codeField.getText().toString());
} else {
    showMessage(R.string.error_rules);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы