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

🗒 Задача

Для регистрации в приложении пользователь придумывает логин и пароль. И логин, и пароль должны содержать в себе хотя бы 4 символа. Если всё верно, программа выводит приветственное сообщение.

  • считывай логин и пароль с консоли поочередно;

  • вынеси в отдельную функцию валидацию длины введенных данных;

  • если логин или пароль меньше 4 символов – вывести сообщение: "Логин или пароль недостаточно длинные".

❌ Ошибки

  • переводят строку в CharArray, чтобы достать проперти size – предлагать исппользовать length для строки без лишних преобразований

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

В Kotlin, как и в большинстве других языков программирования, принято использовать глаголы в инфинитиве для названия функций, которые выполняют некоторые действия. Поэтому лучше назвать функцию так, чтобы звучало лаконично и отражало суть выполняемого действия.
== true это лишнее дублирование подтверждения. Функция и так возвращает результат условия
Давай вынесем в константу, чтобы каждый раз не тратить ресурсы на создание переменной при заходе в функцию
Значение в этом коде является [магическим числом](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). Как я мог упоминать раньше – не лучшая практика. Предлагаю вынести в переменную. 
В целом нейминг логичен, но все таки если придерживаться принципу названия переменных в инфинитиве, то лучше глаголом и такую валидацию называть. Нам важнее при чтении кода определять где функции, а где просто Boolean переменные
Предлагаю более короткую форму использовать – возвращать значение без return
Функции всегда обосабливаются пустыми строками-разделителями сверху и снизу. Так их гораздо легче идентифицировать в файлах с большим количеством кода.
"проверку длины логина или пароля вынеси в отдельную функцию"

Проверка вынесена, но еще лучшей практикой будет расценить это требование буквально. То есть только валидировать и отдавать результат типа `Boolean`

И нейминг функции тоже надо доработать. Лучше отвечать на вопрос "что сделать". Иными словами функции надо именовать в инфинитиве.
Хорошо, что вынесено в отдельные функции определенные действия, но получилось так, что теперь в мейне вобще отсутствует логика программы. Более того, в этих функциях теперь есть дублирующийся код (проверка длины). А наша цель выносить в методы именно повторяющиеся действия.
Вывод: основная логика должна остаться в мейне. Методы вызывать в коде по мере их необходимости.
Этот код повторяется в обеих функциях. Его следует вынести в еще один дополнительный метод и вызывать там, где требуется проверка. Причем этот новый метод должен принимать значения и возвращать узкоспециализированный результат (Boolean).

Отлично! можно вообще в такой короткой форме
fun checkPasswordLength(incomingString: String) = incomingString.length > 3

1. Функция должна только валидировать, а у тебя в нее занесена дополнительная логика. Нарушаем принцип единой ответственности.
2. Хорошо, что нашел решение через получение size, но это длинный путь , т. к. у класса String есть свойство length, оно возвращает длину строки.
константы указываются в другом синтаксисе
циклы и условные выражения лучше обосабливать пустыми строками для улучшения читабельност
Вызывать функцию дважды имеет смысл если они вызываются в разное время. в текущей программе можно просто принимать два параметра сразу
Проверку длины логина или пароля вынеси в отдельную функцию, которая валидирует длину пароля. Давай сделаем так, чтобы функция возвращала Boolean, а в main она использовалась, для того чтобы принять решение о вызове println(...)
А попробуй еще объединить return и if
В обеих реализациях можно обойтись без дополнительной переменной
Проверку длины логина или пароля вынеси в отдельную функцию, которая валидирует длину пароля;
Назвать можно немного получше, отвечая на условный вопрос "что сделать" – проверитьДлинуЛогинаПароля, например.
И так как эта функция только валидирует, не стоит нагружать ее доп функционалом. пусть эта функция только валидирует и возвращает результат проверки. а вся остальная логика будет в мейне
Также предлагаю сузить функциональность этого метода. пусть он только валидирует и возвращает результат. чтобы логика продолжалась в основной функции
Функции обосабливаются пустыми строками сверху и снизу
думаю можно для красоты еще засунуть проверки в цикл с условием пока проверка возвращает false
Можно пойти двумя путями: инфинитив - например, checkPasswordLegth() или validateInputLength(); или по аналогии с Boolean переменным – например isUserInputLengthValid()
Предлагаю сделать чтобы функция только валидировала длину пароля, а возвращать нужно Boolean значение. Целые числа и сравнение с ними выглядит сильно лишним)
Название функции следует сделать более корректно стилистике (инфинитив)
Предлагаю сделать короткую форму, сразу возвращая результат без ключевого слова return

🧾 Решение

fun main() {
    println("Введите логин и пароль поочередно")

    val login = readln()
    val password = readln()

    if (validateData(login) && validateData(password)) {
        println("Добро пожаловать! Вы зарегистрированы")
    } else {
        println("Недостаточная длина логина или пароля")
    }
}

fun validateData(data: String): Boolean {
    return data.length >= MIN_LENGTH_DATA
}

const val MIN_LENGTH_DATA = 4