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

🗒 Задача

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

Имитируй эти действия в консоли, путем считывания данных с клавиатуры. При успешном решении вход в программу символизируется сообщением “Добро пожаловать!". В противном случае вывести сообщение "Доступ запрещен."

❌ Ошибки

  • не ошибка, но можно рекомендовать при аппруве еще пользоваться sum() для сложения

  • делают if else с одной строкой в теле с громоздкими фигурными скобками

  • некачественный нейминг (просто буквами)

  • сумма захардкожена и не считается автоматически — думать о расширяемости кода

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

Нужно предлагать полноценным сообщением для пользователя пройти капчу (решить пример)
Использование оператора `!!` подразумевает, что ты уверен в том, что значение не может быть `null`. Однако, если это не так, то приложение "упадет" с ошибкой. Поэтому этот оператор считается опасным и не рекомендуется использовать. Только в крайних случаях. 

Это противоречит основной идее безопасности типов в Kotlin, поэтому лучше использовать альтернативные способы обработки нулабельных значений. Такие как оператор безопасного вызова `?.`, элвис-оператор `?:` или оператор `let`.

Но пока я рекомендую использовать более свежую функцию readln(). Метод под капотом обрабатывает нулябельность и все кастует в строку (в том числе null становится строкой “null”)
Нам необходимо думать об обслуживании и расширяемости кода. Сумма должна считаться автоматически из объявленных заранее переменных.
в Kotlin открываемая скобка ставится на той же строке, что и условие if)
Лучше использовать более понятный нейминг. Иначе сложно быстро войти в контекст для чего нужны эти переменные в рамках большой программы.
Эту строку тоже можно перенести выше. Чтоб if else имели условия в одну строку. Для красоты кода (в идеале, если они не слишком длинные)
Значение в этом коде является [магическим числом](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#%D0%9F%D0%BB%D0%BE%D1%85%D0%B0%D1%8F_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Не лучшая практика. добавь, пожалуйста, переменные для инициализированных значений и суммы)
Как правило для таких функций есть более свежие, более удобные и лучше читаемые альтернативы в виде экстеншн функций. Более современными инструментами в принципе нормально пользоваться) Здесь я бы использовал экстеншн получения рандомного числа из диапазона: `(1..10).random()`
Любой импорт – лишний код в классе. Неиспользуемый импорт – неиспользуемый код. Существуют условно тонкие материи, когда надо использовать какую-то конкретную реализацию под капотом. Поэтому обоснованно может быть вызвать некую альтернативу из Котлин или похожий функционал, но с другим внутренним алгоритмом из Джавы. Ситуативно. Здесь я бы использовал экстеншн получения рандомного числа из диапазона: `(1..10).random()`
Код выглядит немного монолитным. Рекомендую добавить пустые строки после блока с объявлением переменных и также разделять код от начала условного ветвления.
Давай перенесем вычисление суммы и сравнение в условие. Тут не такой сложный код на мой взгляд, чтобы плодить дополнительные переменные для повышения читаемости)
Способ генерации чисел для примера есть попроще) Например, через создание диапазона (0..9).random()

🧾 Решение

fun main() {
    val number1 = (0..10).random()
    val number2 = (0..10).random()

    println("Подтвердите,что вы не робот, сложите два числа: $number1 и $number2")

    val answer = readln().toInt()
    if (answer == number1 + number2)
        println("Добро пожаловать!")

    else println("Доступ запрещен!")
}
fun main() {
    val num1 = (1..10).random()
    val num2 = (1..10).random()

    val correctAnswer = num1 + num2

    println("Для входа в приложение решите математическую задачу:")
    println("Сколько будет $num1 + $num2?")

    val userAnswer = readln().toIntOrNull()

    if (userAnswer == correctAnswer) {
        println("Добро пожаловать!")
    } else {
        println("Доступ запрещен.")
    }
}