Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.
Создание расширяемого класса для взаимодействия с файловой системой
Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать класс, который:
- Способен открывать и закрывать файл;
- Предоставляет методы для чтения из файла и записи в него;
- Спроектирован таким образом, чтобы в дальнейшем его можно было без труда модифицировать (например, добавить логирование, шифрование, компрессию и т.п.). Необходимо описать предлагаемую архитектуру и интерфейс класса:
- Какие методы и свойства будут включены?
- Каким образом обеспечить возможность расширения и гарантировать безопасность использования?
Тип задачи: system design
Ответ
Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.
Контракт должен задавать режим открытия, формат байтов, частичные чтения и записи, конец файла и ошибки. Ресурс освобождается через RAII; копирование владельца запрещают либо явно определяют, а перемещение передаёт владение.
Явные flush/close позволяют сообщить об ошибке записи; деструктор не должен выпускать исключения. Декораторы реализуют тот же байтовый интерфейс, но порядок преобразований нужно зафиксировать. Для недоверенного пути отдельно проверяют разрешённую область доступа; секреты и содержимое файла не должны автоматически попадать в лог.