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

🗒 Задача

В приложении для хранения облачных файлов есть папки и файлы.

Создай класс папки, который имеет имя, количество файлов и флаг “секретно”. Если флаг имеет значение true, то при попытке прочитать имя, возвращать строку “скрытая папка” и количество файлов – 0. В ином случае возвращать ее название и реальное количество файлов. Для реализации должны использоваться геттеры.

Создай экземпляр “скрытой” папки. Протестируй попытку чтения ее данных.

❌ Ошибки

  • название класса сущности во множественном числе — объяснить что класс, это шаблон одного будущего объекта в данном контексте

  • при обращении к папке присваивают

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

val name: String и val folderName: String

с помощью вал выделяет память под две переменные одного значения. что излишнее действие.
следует забирать данные в основном конструкторе и присваивать их объявленному полю внутри класса, где используется кастомный сеттер или геттер. так что предлагаю проинициализировать полем name (и для name не выделять память)
Название будущего экземпляра папки в данном контексте корректнее делать в единственном числе. Это шаблон будущей сущности.
Получилось немного сумбурно. Здесь не сразу понятно какая именно папка создается. Давай сделаем класс более универсальным. Предлагаю оставить объявленные поля в теле класса, как сейчас. Но еще добавим основной конструктор и продублируем их туда с `_` в начале. Таким образом мы и геттер переопределяем, и с любым значением, которое нам нужно создаем объект.
По условию мы задаем конкретный объект папки. У сущности есть поля для этого объекта, так как нам нужен универсальный класс, а иначе во всех созданных объектах по умолчанию будет создаваться по N файлов.
А может обойдемся без создания дополнительных приватных полей для которых требуется кастомизация геттеров/сеттеров?)
Boolean поле корректнее называть как бы “отвечая на вопрос да/нет”. Например, isSecret.
Если папка скрыта ты затираешь ее название и количество. Фактически испортив документ.
Отлично. Теперь чуть оптимизируем.
- Можно возвращать в более короткой форме (без return)
- И так как в условном выражении только по одной строке в ветках, можно опустить скобки и компактно разместить на одной строке `get() = if (isSecret) 0 else field`
Ты и печатаешь, и возвращаешь строку. А согласно ТЗ надо только возвращать
Свойство с количеством должно возвращаться только при вызове соответствующей переменной
Можно использовать короткую форму без return, а сразу через знак `=`

🧾 Решение

class Folder(
    name: String,
    fileCount: Int,
    private val isSecret: Boolean,
) {

    val folderName = name
        get() = if (isSecret) "скрытая папка" else field

    val folderFileCount = fileCount
        get() = if (isSecret) 0 else field
}

fun main() {
    val secretFolder = Folder("Мои Документы", 10, true)

    println("Имя папки: ${secretFolder.folderName}")
    println("Количество файлов: ${secretFolder.folderFileCount}")
}