-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSingletonTask.txt
More file actions
101 lines (75 loc) · 6.81 KB
/
SingletonTask.txt
File metadata and controls
101 lines (75 loc) · 6.81 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Система логов и отладки (Game Logger)
Контекст:
В любой игре, даже консольной, нужна система логирования.
Она записывает, что происходит в игре: игрок получил урон, подобрал предмет, уровень загружен, произошла ошибка.
Эта система должна быть доступна из любой точки кода (из классов игрока, врагов, UI, системы сохранений).
И она должна быть одна на всю игру - нет смысла создавать несколько независимых логгеров,
которые не знают о записях друг друга.
Твоя задача — реализовать эту систему как Singleton.
Что нужно сделать:
1. Создай класс GameLogger, который реализует паттерн Singleton.
- Конструктор должен быть приватным - никто снаружи не должен создавать экземпляр через new.
- Предоставь статическое свойство или метод для доступа к единственному экземпляру.
2. Добавь хранилище сообщений:
- Внутренний список (например, List<string>) для хранения всех сообщений, которые были записаны.
3. Реализуй метод Log(string message):
- Добавляет сообщение в список.
- Выводит сообщение в консоль с временной меткой (например, [19:45:32] Игрок получил 10 урона).
- Используй текущее время: DateTime.Now.ToString("HH:mm:ss").
4. Реализуй метод PrintAllLogs():
- Выводит в консоль все накопленные сообщения в том порядке, в котором они были добавлены.
- Если логов нет, вывести сообщение "Лог пуст".
5. В методе Main продемонстрируй работу:
- Попробуй создать экземпляр через new GameLogger() - компилятор должен выдать ошибку (это и есть цель Singleton).
- Получи доступ к логгеру через статическое свойство.
- Вызови Log из разных "систем" (можно просто из разных методов, имитируя разные компоненты игры):
- Из "системы игрока" - запись о получении урона.
- Из "системы инвентаря" - запись о подборе предмета.
- Из "системы сохранения" - запись о сохранении игры.
- В конце вызови PrintAllLogs() и убедись, что все сообщения на месте.
Бонус-задание:
Добавь уровни логирования:
- Создай enum LogLevel с уровнями: Info, Warning, Error.
- Метод Log должен принимать уровень сообщения: Log(string message, LogLevel level).
- При выводе в консоль используй разные цвета:
- Info - белый (по умолчанию)
- Warning - желтый (Console.ForegroundColor = ConsoleColor.Yellow)
- Error - красный (Console.ForegroundColor = ConsoleColor.Red)
- Не забудь сбрасывать цвет после вывода: Console.ResetColor().
- В сообщение добавляй уровень: [19:45:32] [ERROR] Не удалось загрузить файл сохранения.
Пример вывода программы:
[19:45:31] [INFO] Игрок загрузился в локации "Лес"
[19:45:32] [INFO] Игрок получил 10 урона
[19:45:32] [WARNING] У игрока осталось 5 здоровья!
[19:45:33] [INFO] Подобран предмет "Целебное зелье"
[19:45:34] [ERROR] Не удалось сохранить игру: файл занят
=== ВСЕ ЛОГИ ===
1. [19:45:31] [INFO] Игрок загрузился в локации "Лес"
2. [19:45:32] [INFO] Игрок получил 10 урона
3. [19:45:32] [WARNING] У игрока осталось 5 здоровья!
4. [19:45:33] [INFO] Подобран предмет "Целебное зелье"
5. [19:45:34] [ERROR] Не удалось сохранить игру: файл занят
Ограничения (важно):
- Только базовые конструкции: классы, статика, списки, enum, enum switch.
- Цель - понять суть Singleton: один экземпляр на всё приложение, доступный из любой точки.
Ответ на дополнительный вопрос (про проблемы Singleton):
Когда Singleton плох?
1. Скрытые зависимости:
Код, который использует Singleton, неявно зависит от него.
Это усложняет тестирование - нельзя подменить логгер на "фейковый" для юнит-тестов.
2. Глобальное состояние:
Singleton - это глобальная переменная в красивой обертке.
Если в игре начнет использоваться много Singleton, становится сложно отслеживать, кто и когда меняет состояние.
3. Проблемы в многопоточной среде:
Нужно заботиться о потокобезопасности.
4. Нарушение принципа единственной ответственности (SRP):
Singleton управляет и своим созданием, и своей логикой.
В играх Singleton часто используют для:
- Логгеров (как в задании)
- Менеджеров звука
- Менеджеров сохранений
- Глобальных настроек
Но лучше избегать Singleton для:
- Классов, которые могут понадобиться в нескольких экземплярах позже
- Классов, которые нужно тестировать изолированно
- Классов с нетривиальной логикой инициализации