Skip to content

Реализация консольного приложения "Заметки"#1

Open
Artem-SPb wants to merge 1 commit into
mainfrom
dev
Open

Реализация консольного приложения "Заметки"#1
Artem-SPb wants to merge 1 commit into
mainfrom
dev

Conversation

@Artem-SPb

Copy link
Copy Markdown
Owner

Добрый день!
Направляю на проверку консольное приложение "Заметки".

Что было сделано:

  1. Реализовал структуру классов согласно заданию. Разделил логику на отдельные файлы, чтобы не нагромождать Main.kt:
    • Models.kt — для данных (Archive, Note).
    • Menu.kt — универсальный класс для отображения меню и обработки ввода.
    • Screens.kt — основная логика переходов между экранами и хранение данных.
  2. Настроил навигацию:
    • Можно создавать архивы, заходить в них, создавать там заметки и читать их.
    • Реализован выход назад из любого меню и полный выход из программы.
  3. Валидация данных:
    • Программа проверяет, чтобы пользователь вводил именно цифры в меню.
    • Нельзя создать архив или заметку с пустым названием/текстом.

💡 Особенности реализации:
В процессе работы столкнулся с проблемой, что при добавлении нового архива он не появлялся в меню, так как список передавался один раз.
Решил эту проблему, передавая в класс Menu не готовый список, а лямбду (builder), которая пересобирает список пунктов при каждом обновлении экрана. Теперь новые данные отображаются корректно сразу после создания.

Также добавил README.md с описанием функционала и инструкцией по запуску.
Буду рад обратной связи!

Comment thread src/main/kotlin/Menu.kt
// Я сделал так, чтобы каждый раз при обновлении меню список создавался заново.
// Иначе новые архивы не появлялись бы.
fun showMenu(title: String, itemsBuilder: () -> MutableList<MenuItem>) {
while (true) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Не рекомендую писать бесконечные циклы через while (true) - лучше всегда явно прописывать условие выхода из цикла, чтобы уменьшить вероятность ошибиться и повысить читабельность кода

Comment thread src/main/kotlin/Menu.kt
items[index].action()

// Если это был пункт "Выход", то прерываем цикл while и выходим из меню
if (items[index].title == "Выход") {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Служебную строку лучше вынести в константу, чтобы повысить читабельность кода и не копировать её всюду

Comment thread src/main/kotlin/Models.kt

// Класс для архива. У него есть название и список заметок внутри.
// Используем MutableList, чтобы можно было добавлять новые заметки.
class Archive(val title: String, val notes: MutableList<Note>)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

В data классах не рекомендуется хранить мьютабельные данные (в данном случае MutableList), т.к. в многопоточных средах могут возникнуть проблемы с такими объектами, а именно с доступом к чтению и записи изменяемых полей. У data классов автоматически генерируется функция copy, которую можно использовать для изменения полей объекта с помощью его копирования

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