-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathResourceManagementTask.txt
More file actions
73 lines (56 loc) · 6.01 KB
/
ResourceManagementTask.txt
File metadata and controls
73 lines (56 loc) · 6.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Задача: Система сохранения и логирования игровых сессий (Session Saver & Logger)
Контекст (Техническое задание от "заказчика"):
Ты работаешь над прототипом RPG. Продюсер дал задачу:
"Игроки часто теряют прогресс из-за вылетов.
Нам нужна система, которая автоматически сохраняет состояние игры каждые N секунд и пишет подробный лог в файл.
Если игра вылетит, игрок сможет загрузить последний автосейв, а мы по логам поймем, что пошло не так.
Но есть проблема: если игра крашнется, файл сохранения может быть поврежден, а логи — потеряны.
Твоя задача — сделать так, чтобы ресурсы (файлы, потоки) гарантированно освобождались, а данные не терялись.
Используй IDisposable, using, финализаторы, чтобы быть уверенным в безопасности даже при нештатных ситуациях."
Что нужно сделать:
Создай систему, которая будет писать игровые логи и сохранять состояние, используя правильное управление ресурсами.
Требования к системе:
1. Класс GameLogger (логирование)
- При создании открывает файл session_log.txt для записи (добавление в конец).
- Имеет метод Log(string message) — пишет в файл строку с временной меткой.
- Реализует IDisposable. В Dispose() должен закрывать файл и вызывать GC.SuppressFinalize(this).
- Имеет финализатор (~GameLogger), который вызывает Dispose(false) и пишет в консоль предупреждение:
"Логгер не был явно закрыт! Данные могли потеряться." (Это имитация обнаружения утечки).
2. Класс GameSaver (сохранение)
- Принимает в конструкторе объект GameState (состояние игры).
- Имеет метод SaveToFile(string filePath), который сериализует GameState в JSON и сохраняет в файл.
- Важно: При сохранении используй временный файл (.tmp),
а после успешной записи переименовывай его в основной (.sav).
Это защита от повреждения при вылете.
- Все операции с файлами должны быть обернуты в using, чтобы гарантированно закрыть потоки даже при ошибках.
3. Класс GameState (модель данных)
- Содержит: int Level, int Health, float PositionX, float PositionY, List<string> Inventory.
- Этот класс должен поддерживать сериализацию в JSON
(можно использовать System.Text.Json или Newtonsoft.Json).
4. Класс GameSession (основной класс)
- Управляет игровой сессией.
- Содержит ссылки на GameLogger и GameState.
- Имеет метод Run() — имитирует игровой процесс (цикл из 10 шагов с паузой Thread.Sleep).
- На каждом шаге обновляет состояние (например, +10 здоровья, добавляет предмет) и логирует это.
- Каждые 3 шага вызывает автосохранение через GameSaver.
- Реализует IDisposable. При диспоузе должен корректно задиспоузить GameLogger.
Условия:
- Обязательно продемонстрировать:
- Явный вызов Dispose() (через using или try-finally).
- Ситуацию, где объект не был задиспоужен, и сработал финализатор
(для этого можно закомментировать using в одном из тестов).
- Обработку исключений при работе с файлами
(попытка записи в защищенную папку, диск полон и т.д.).
- Атомарное сохранение (через временный файл).
Чек-лист для самопроверки:
- GameLogger закрывает файл в Dispose()
- В финализаторе GameLogger есть сообщение в консоль
- GameSaver использует временный файл и переименование
- Все FileStream / StreamWriter обернуты в using
- В Main есть пример с using и пример "забытого" объекта
- Обработаны возможные исключения (FileNotFoundException, UnauthorizedAccessException и т.д.)
Бонус-задание (если будет легко):
Добавь в GameSaver метод LoadFromFile(string filePath), который загружает сохранение.
- При загрузке проверяй, существует ли основной файл.
Если нет — проверяй, есть ли временный (может, в прошлый раз сохраняли, но не завершили).
- Если временный файл новее основного — восстанавливай из него (и логируй предупреждение).