Создание расширяемого класса для взаимодействия с файловой системой

Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.

Короткий ответ

Что ответить на собеседовании

Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.

Подробный разбор

Ответ с пояснениями

Условие

Разработать класс, который:

  1. Способен открывать и закрывать файл;
  2. Предоставляет методы для чтения из файла и записи в него;
  3. Спроектирован таким образом, чтобы в дальнейшем его можно было без труда модифицировать (например, добавить логирование, шифрование, компрессию и т.п.). Необходимо описать предлагаемую архитектуру и интерфейс класса:
  • Какие методы и свойства будут включены?
  • Каким образом обеспечить возможность расширения и гарантировать безопасность использования?

Тип задачи: system design

Ответ

Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.

Контракт должен задавать режим открытия, формат байтов, частичные чтения и записи, конец файла и ошибки. Ресурс освобождается через RAII; копирование владельца запрещают либо явно определяют, а перемещение передаёт владение.

Явные flush/close позволяют сообщить об ошибке записи; деструктор не должен выпускать исключения. Декораторы реализуют тот же байтовый интерфейс, но порядок преобразований нужно зафиксировать. Для недоверенного пути отдельно проверяют разрешённую область доступа; секреты и содержимое файла не должны автоматически попадать в лог.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее