Skip to content

Выполненно задание "Пишем консольное приложение №2" - #1

Open
Filippenko-SA wants to merge 2 commits into
mainfrom
dev
Open

Filippenko-SA wants to merge 2 commits into
mainfrom
dev

Conversation

@Filippenko-SA

Copy link
Copy Markdown
Owner

No description provided.

Comment thread src/main/kotlin/Menu.kt Outdated
Comment on lines +6 to +7
private var archives : MutableList<Archive> = mutableListOf()
private var notes : MutableMap<Archive,MutableList<Note>> = mutableMapOf()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По коду заметил, что ссылки на эти объекты не изменяются, поэтому можно заменить var на val

Comment thread src/main/kotlin/Menu.kt Outdated
Comment on lines +23 to +28
try {
input = inputString.toInt()
} catch (e:NumberFormatException) {
println("Ошибка: Введенное значение не является числом\n")
return
}

@IvanGusevE IvanGusevE Mar 26, 2024 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перед преобразованием строки в число, стоит удалить лишние пробелы, используя функцию trim:

val inputString = Scanner(System.in).nextLine().trim()

Таким образом твоя программа будет корректно обрабатывать следующий ввод:
" 2"
"2 "
" 2 "

Также можно воспользоваться функцией-расширением toIntOrNull(), которая вернет null в случае невозможности преобразования строки в число, вместо выброса исключения.

Comment thread src/main/kotlin/Menu.kt Outdated
Comment on lines +35 to +37
println("Ошибка: Выбранный элемент отсутствует\n")
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь return уже не нужен, так как после выхода из блока else метод selectMenu завершит свою работу.

Comment thread src/main/kotlin/Menu.kt Outdated
Comment on lines +75 to +78
if(name == "") {
println("Ощибка: Название не должно быть пустым\n")
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Логику проверки стоит вынести в отдельный метод или класс, так как она дублируется. Также стоит проверить строку на то, что она не состоит из одних пробелов. Для этого ты можешь воспользоваться функцией-расширением isBlank():

if (name.isBlank()) {
   ...
   return
}

Comment thread src/main/kotlin/Menu.kt Outdated
Comment on lines +87 to +99
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
}
}
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

С применением некоторых приятных особенностей Kotlin можно переписать данный метод так:

  1. Вынести return за when, либо же написать вообще одним выражением
  2. Вместо проверки на null можно воспользоваться оператором элвис
private fun getSize() = when (screenType) {
   ScreenType.ARCHIVES -> archives.size
   ScreenType.NOTES -> notes[currentArchive]?.size ?: 0
}

Comment thread src/main/kotlin/Input.kt
Comment on lines +13 to +17
if(str.isBlank()) {
println("Ошибка: Введенна пустая строка\n")
return null
}
return str

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно воспользоваться функцией-расширением ifBlank в данном случае следующим образом:

    val str = Scanner(System.`in`).nextLine()
    return str.ifBlank {
        println("Ошибка: Введенна пустая строка\n")
        null
    }

Если строка пустая или состоит только из пробелов, то ifBlank возвращает результат, переданный в качестве параметра. Если же строка содержит какие-либо другие символы, то возвращается сама строка.

Comment on lines +14 to +22
fun getData(archive: Archive): ArrayList<Note>?{
return notes[archive]
}
fun addData(name:String){
val archive = Archive(name)
if(!notes.containsKey(archive)){
notes[archive] = ArrayList()
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю использовать более осмысленные названия методов для улучшения читаемости кода:

addData -> addArchive или addNoteByArchive: это позволит сразу понять, что происходит при добавлении данных, а именно, добавление архива или заметки в архив.
getData -> getAllArchives или getNotesByArchive: такое название явно указывает на то, что возвращается, а именно, все архивы или заметки, относящиеся к конкретному архиву.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment on lines +8 to +12
fun getData(): ArrayList<Archive>{
val result: ArrayList<Archive> = ArrayList()
notes.forEach { (archive, _) -> result.add(archive) }
return result
}

@IvanGusevE IvanGusevE Mar 29, 2024 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вместо forEach можно использовать функцию map следующим образом:

fun getData(): ArrayList<Archive> {
   return notes.map { entry -> entry.key }.let{ archives -> ArrayList(archives) }
}

Это позволяет избежать лишней инициализации переменной и делает код более компактным

Comment on lines +16 to +27
fun selectMenu(input:Int?){
if (input != null){
when(input) {
0 -> create()
getSize()+1 -> back()
in 1 .. getSize() -> select(input-1)
else -> {
println("Ошибка: Выбранный элемент отсутствует\n")
}
}
}
}

@IvanGusevE IvanGusevE Mar 29, 2024 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вместо явной проверки на null в блоке when можно сразу использовать вариант null, что позволит избежать лишней вложенности в функции.

when (input) {
            null -> Unit
            0 -> create()
            getSize() + 1 -> back()
            in 1..getSize() -> select(input - 1)
            else -> {
                println("Ошибка: Выбранный элемент отсутствует\n")
            }
}

Comment on lines +52 to +55
val str = inputString()
if (str != null) {
MenuData.addData(str)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если нужно выполнить какое-то выражение с переменной, только если она не равна null, то можно использовать функцию области видимости let с проверкой на null:

inputString()?.let { str -> MenuData.addData(str) }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants