-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEntryPointTask.txt
More file actions
105 lines (76 loc) · 5.9 KB
/
EntryPointTask.txt
File metadata and controls
105 lines (76 loc) · 5.9 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
102
103
104
105
Entry Point — это тема, которая часто остается за кадром, но критически важна.
Речь идет о правильной организации точки входа в приложение:
инициализация зависимостей, настройка окружения, обработка аргументов командной строки, корректное завершение работы.
Практическое задание: "Модульная система запуска игрового сервера"
Контекст
Ты разрабатываешь серверную часть для многопользовательской текстовой RPG.
Сервер должен запускаться с разными конфигурациями в зависимости от окружения (разработка, тестирование, продакшн).
Твоя задача — реализовать гибкую точку входа, которая обрабатывает аргументы командной строки и корректно настраивает систему перед запуском.
Техническое задание
Создай класс GameServerEntryPoint с методами, которые будут вызываться из Main.
Реализуй следующие функции:
Метод 1: ParseArguments(string[] args)
Что делает: Парсит аргументы командной строки и возвращает объект конфигурации.
Формат аргументов:
--mode dev|test|prod
--port <число>
--debug true|false
--config <путь к файлу> (опционально)
Пример вызова:
GameServer.exe --mode prod --port 8080 --debug false --config server.json
Требования:
- Если --mode не указан — используется dev
- Если --port не указан — используется 7777 для dev, 8888 для test, 8080 для prod
- Если --debug не указан — true для dev, false для test и prod
- Если передан неизвестный аргумент — вывести предупреждение в консоль (но не прерывать запуск)
- Используй обработку ошибок (try-catch) при парсинге чисел и булевых значений
- Используй Service Locator (который ты уже изучил) для хранения итоговой конфигурации
Метод 2: InitializeServices(ServerConfig config)
Что делает: Инициализирует сервисы сервера на основе полученной конфигурации.
Логика работы:
1. Выводит в консоль приветственное сообщение с текущим режимом и портом
2. Если режим dev — дополнительно выводит предупреждение "ВНИМАНИЕ: Режим разработки. Логирование включено."
3. Если debug == true — подписывается на событие (делегаты/события, которые ты изучил) и выводит все действия сервера в консоль
4. Имитирует загрузку конфигурации (если указан параметр --config):
- Использует сериализацию JSON для чтения файла
- При ошибке чтения файла использует значения по умолчанию
5. Возвращает true, если инициализация прошла успешно, иначе false
Метод 3: RunServerLoop()
Что делает: Запускает основной цикл сервера (упрощенная версия).
Логика работы:
- Выводит сообщение "Сервер запущен. Нажмите Ctrl+C для остановки."
- Ожидает нажатие клавиш (можно через Console.ReadKey с проверкой на ConsoleKey.Escape)
- При нажатии Escape — выводит "Завершение работы..." и корректно останавливается
- При нажатии любой другой клавиши — выводит "Обработан запрос" (имитация обработки клиента)
- Использует обработку исключений для перехвата неожиданных ошибок
- В блоке finally или через IDisposable выводит "Сервер остановлен. Ресурсы освобождены."
Структура, которая должна получиться:
public class ServerConfig
{
public string Mode { get; set; }
public int Port { get; set; }
public bool Debug { get; set; }
public string ConfigPath { get; set; }
}
public class GameServerEntryPoint
{
public ServerConfig ParseArguments(string[] args) { /* ... */ }
public bool InitializeServices(ServerConfig config) { /* ... */ }
public void RunServerLoop() { /* ... */ }
}
В Program.Main:
static void Main(string[] args)
{
var entryPoint = new GameServerEntryPoint();
var config = entryPoint.ParseArguments(args);
if (entryPoint.InitializeServices(config))
{
entryPoint.RunServerLoop();
}
else
{
Console.WriteLine("Ошибка инициализации сервера.");
}
}
Бонус (по желанию)
Добавь поддержку флага --help, который выводит справку по всем аргументам и завершает работу без запуска сервера.