🗒 Задача¶
Нужно написать часть модуля для авторизации пользователя. Для входа в приложение пользователь должен доказать, что он не бот. Для этого программа предлагает решить простой математический пример – сложить два числа (сообщить об этом пользователю).
Имитируй эти действия в консоли, путем считывания данных с клавиатуры. При успешном решении вход в программу символизируется сообщением “Добро пожаловать!". В противном случае вывести сообщение "Доступ запрещен."
❌ Ошибки¶
-
не ошибка, но можно рекомендовать при аппруве еще пользоваться sum() для сложения
-
делают if else с одной строкой в теле с громоздкими фигурными скобками
-
некачественный нейминг (просто буквами)
-
сумма захардкожена и не считается автоматически — думать о расширяемости кода
✏️ Комментарии¶
Использование оператора `!!` подразумевает, что ты уверен в том, что значение не может быть `null`. Однако, если это не так, то приложение "упадет" с ошибкой. Поэтому этот оператор считается опасным и не рекомендуется использовать. Только в крайних случаях.
Это противоречит основной идее безопасности типов в Kotlin, поэтому лучше использовать альтернативные способы обработки нулабельных значений. Такие как оператор безопасного вызова `?.`, элвис-оператор `?:` или оператор `let`.
Но пока я рекомендую использовать более свежую функцию readln(). Метод под капотом обрабатывает нулябельность и все кастует в строку (в том числе null становится строкой “null”)
Нам необходимо думать об обслуживании и расширяемости кода. Сумма должна считаться автоматически из объявленных заранее переменных.
Лучше использовать более понятный нейминг. Иначе сложно быстро войти в контекст для чего нужны эти переменные в рамках большой программы.
Эту строку тоже можно перенести выше. Чтоб 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()`
Код выглядит немного монолитным. Рекомендую добавить пустые строки после блока с объявлением переменных и также разделять код от начала условного ветвления.
Давай перенесем вычисление суммы и сравнение в условие. Тут не такой сложный код на мой взгляд, чтобы плодить дополнительные переменные для повышения читаемости)
🧾 Решение¶
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("Доступ запрещен.")
}
}