Repository navigation
Выполненно задание "Пишем консольное приложение №2" - #1
Filippenko-SA wants to merge 2 commits into
Conversation
| private var archives : MutableList<Archive> = mutableListOf() | ||
| private var notes : MutableMap<Archive,MutableList<Note>> = mutableMapOf() |
There was a problem hiding this comment.
По коду заметил, что ссылки на эти объекты не изменяются, поэтому можно заменить var на val
| try { | ||
| input = inputString.toInt() | ||
| } catch (e:NumberFormatException) { | ||
| println("Ошибка: Введенное значение не является числом\n") | ||
| return | ||
| } |
There was a problem hiding this comment.
Перед преобразованием строки в число, стоит удалить лишние пробелы, используя функцию trim:
val inputString = Scanner(System.in).nextLine().trim()
Таким образом твоя программа будет корректно обрабатывать следующий ввод:
" 2"
"2 "
" 2 "
Также можно воспользоваться функцией-расширением toIntOrNull(), которая вернет null в случае невозможности преобразования строки в число, вместо выброса исключения.
| println("Ошибка: Выбранный элемент отсутствует\n") | ||
| return | ||
| } |
There was a problem hiding this comment.
Здесь return уже не нужен, так как после выхода из блока else метод selectMenu завершит свою работу.
| if(name == "") { | ||
| println("Ощибка: Название не должно быть пустым\n") | ||
| return | ||
| } |
There was a problem hiding this comment.
Логику проверки стоит вынести в отдельный метод или класс, так как она дублируется. Также стоит проверить строку на то, что она не состоит из одних пробелов. Для этого ты можешь воспользоваться функцией-расширением isBlank():
if (name.isBlank()) {
...
return
}
| private fun getSize():Int { | ||
| when(screenType) { | ||
| ScreenType.ARCHIVES -> return archives.size | ||
| ScreenType.NOTES -> { | ||
| val result = notes[currentArchive]?.size | ||
| if(result == null){ | ||
| return 0 | ||
| } else { | ||
| return result | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
С применением некоторых приятных особенностей Kotlin можно переписать данный метод так:
- Вынести return за when, либо же написать вообще одним выражением
- Вместо проверки на null можно воспользоваться оператором элвис
private fun getSize() = when (screenType) {
ScreenType.ARCHIVES -> archives.size
ScreenType.NOTES -> notes[currentArchive]?.size ?: 0
}
| if(str.isBlank()) { | ||
| println("Ошибка: Введенна пустая строка\n") | ||
| return null | ||
| } | ||
| return str |
There was a problem hiding this comment.
Можно воспользоваться функцией-расширением ifBlank в данном случае следующим образом:
val str = Scanner(System.`in`).nextLine()
return str.ifBlank {
println("Ошибка: Введенна пустая строка\n")
null
}
Если строка пустая или состоит только из пробелов, то ifBlank возвращает результат, переданный в качестве параметра. Если же строка содержит какие-либо другие символы, то возвращается сама строка.
| fun getData(archive: Archive): ArrayList<Note>?{ | ||
| return notes[archive] | ||
| } | ||
| fun addData(name:String){ | ||
| val archive = Archive(name) | ||
| if(!notes.containsKey(archive)){ | ||
| notes[archive] = ArrayList() | ||
| } | ||
| } |
There was a problem hiding this comment.
Предлагаю использовать более осмысленные названия методов для улучшения читаемости кода:
addData -> addArchive или addNoteByArchive: это позволит сразу понять, что происходит при добавлении данных, а именно, добавление архива или заметки в архив.
getData -> getAllArchives или getNotesByArchive: такое название явно указывает на то, что возвращается, а именно, все архивы или заметки, относящиеся к конкретному архиву.
There was a problem hiding this comment.
С названиями действительно можно поработать, но в данном случае мне было интересно воспользоваться перегрузкой функций, поэтому предложенные названия мне бы не подошли
| fun getData(): ArrayList<Archive>{ | ||
| val result: ArrayList<Archive> = ArrayList() | ||
| notes.forEach { (archive, _) -> result.add(archive) } | ||
| return result | ||
| } |
There was a problem hiding this comment.
Вместо forEach можно использовать функцию map следующим образом:
fun getData(): ArrayList<Archive> {
return notes.map { entry -> entry.key }.let{ archives -> ArrayList(archives) }
}
Это позволяет избежать лишней инициализации переменной и делает код более компактным
| fun selectMenu(input:Int?){ | ||
| if (input != null){ | ||
| when(input) { | ||
| 0 -> create() | ||
| getSize()+1 -> back() | ||
| in 1 .. getSize() -> select(input-1) | ||
| else -> { | ||
| println("Ошибка: Выбранный элемент отсутствует\n") | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Вместо явной проверки на null в блоке when можно сразу использовать вариант null, что позволит избежать лишней вложенности в функции.
when (input) {
null -> Unit
0 -> create()
getSize() + 1 -> back()
in 1..getSize() -> select(input - 1)
else -> {
println("Ошибка: Выбранный элемент отсутствует\n")
}
}
| val str = inputString() | ||
| if (str != null) { | ||
| MenuData.addData(str) | ||
| } |
There was a problem hiding this comment.
Если нужно выполнить какое-то выражение с переменной, только если она не равна null, то можно использовать функцию области видимости let с проверкой на null:
inputString()?.let { str -> MenuData.addData(str) }
No description provided.