Перейти к содержанию

🗒 Задача

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

Если логин или пароль введены неверно – данные запрашиваются заново. Если данные верны, выводится сообщение – “Авторизация прошла успешно”.

❌ Ошибки

  • делают внутренние условия if – достаточного использовать do while и только одного условия проверки обоих данных в условии

  • делают код монолитным – предлагать отделять пустыми строками цикл от всего остального кода

✏️ Комментарии

Предлагаю использовать более свежую функцию чтения с консоли readln(). Она не требует обработки null, а делает приведение всего входящего к строке под капотом. 

Дело в том, что readLine() по умолчанию возвращает тип `String?`. Далее ты приводишь к строке `toString()`, тем самым превращая null в строку "null". Это не очень корректная обработка nullable. Более правильно использовать операторы безопасного вызова типа `let` или `.?`. Об этом будет в уроке про нулябельность. Но пока предлагаю использовать readln().
Приведение к .toString() тут избыточно, потому что функция readln() уже возвращает строку (среда разработки предлагает удалить, чтобы улучшить читаемость кода и избежать лишней операции)
Предлагаю более понятно и релевантно называть переменные, чтобы другой программист быстрее вникал в твой код) Самому не путаться тоже помогает.
Отдели плз переменные от цикла пустой строкой, чтобы было более наглядно. Так код будет выглядеть менее монолитно, что повысит читабельность.
Такие многострочные распечатки довольно редко используются и сам код визуально выглядит загруженным. Лучше использовать просто символ переноса строки.
Это условие можно перенести в условие цикла и не придется внедрять дополнительную ветку условного выражения)
Давай оптимизируем. Если использовать `do while`, то сначала в цикле будет производиться запрос логина и пароля, а в условии цикла проверка "пока логин и пароль не равны введенным значениям".
Таким образом сообщение об успешной авторизации можно выводить после цикла, тк если он остановится и программа продолжит работу - значит пользователь ввел верные данные.
Выглядит неплохо, но все таки лучше использовать циклы в их полную функциональность. поэтому предлагаю не добавлять лишние условия внутри цикла, а сделать одно условие сразу в условии цикла
Отсутствует отступ слева (следи за уровнем вложенности)

🧾 Решение

fun main() {

    println("Создайте логин")
    val logUser = readln()
    println("Придумайте пароль")
    val passUser = readln()
    println("Регистрация прошла успешно")

    do {
        println("Введите логин")
        val logEnter = readln()
        println("Введите пароль")
        val passEnter = readln()

    } while (logEnter != logUser || passEnter != passUser)

    println("Авториизация прошла успешно")

}