Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Варіанти
Варіант 1. Сповіщення про оцінки
1. Початковий рівень. Створити консольну програму, у якій сервіс GradeService отримує через конструктор інтерфейс INotifier з реалізаціями EmailNotifier і SmsNotifier, що виводять повідомлення на консоль. Користувач вводить прізвище студента й оцінку, а реалізацію обирає реєстрація в ServiceCollection.
2. Базовий рівень. Створити консольну програму, у якій канали сповіщень про оцінки e-mail, SMS і Telegram (виводять повідомлення на консоль) зареєстровано як ключові сервіси INotifier. Користувач вводить прізвище студента, оцінку (1–100, перевірка) і канал; для оцінки нижче 60 додатково надсилається сповіщення куратору, а невідомий канал спричиняє повідомлення про помилку.
3. Високий рівень. Створити застосунок із хостом «Сповіщення про оцінки», який читає файл CSV з оцінками (прізвище, оцінка; шлях і канал за замовчуванням – аргументи --file, --channel, --help) і сервісом GradeService надсилає сповіщення через ключові сервіси INotifier (e-mail, SMS, Telegram з виведенням на консоль), журналює кожне надсилання з полями Student і Grade, повідомляє про помилки в потік помилок з кодом завершення 1 і має модульні тести GradeService з фейковим INotifier.
Варіант 2. Курси валют
1. Початковий рівень. Створити консольну програму, яка отримує через контейнер сервіс IRateProvider (курси USD, EUR, PLN задано в класі) і конвертує введену користувачем суму в гривнях в обрану валюту.
2. Базовий рівень. Створити консольну програму з хостом, яка конвертує введену суму в гривнях в обрану валюту; курси валют і час життя кешу в секундах читаються з appsettings.json через шаблон параметрів, а Singleton-сервіс кешу повертає збережені курси й записує в журнал, коли курси оновлюються. Некоректні суми та коди валют відхиляються з повідомленням.
3. Високий рівень. Створити застосунок із хостом «Обмінник», у якому два постачальники курсів (файл JSON і фейковий із випадковими курсами) обираються параметром конфігурації, фонова служба оновлює кеш за інтервалом, а команда convert --from USD --to EUR --amount 100 виводить результат; параметри перевіряються під час запуску, помилки записуються в журнал, є модульні тести кешу з FakeTimeProvider.
Варіант 3. Контроль температури складу
1. Початковий рівень. Створити консольну програму, у якій сервіс ITemperatureSensor (фейковий датчик з випадковими значеннями) і сервіс Thermostat зареєстровано в контейнері; програма виконує десять вимірювань і виводить значення з позначкою «норма» або «перевищення» для порогу 8 °C.
2. Базовий рівень. Створити консольний хост контролю температури складу із BackgroundService, що кожні N секунд читає температуру фейкового датчика (випадкові значення); мінімальний і максимальний пороги та інтервал задано в IOptions<T> з перевіркою [Range], а вихід за межі записується в журнал рівнем Warning.
3. Високий рівень. Створити застосунок із хостом «Склад», який контролює температуру кількох камер (назва, пороги в масиві конфігурації), для кожної періодично виконує вимірювання фейковим датчиком, журналює тривоги генератором [LoggerMessage], під час зупинки за Ctrl+C записує в файл CSV звіт про кількість тривог і має модульні тести логіки порогів.
Варіант 4. Обчислення знижок
1. Початковий рівень. Створити консольну програму, у якій стратегії знижок IDiscountStrategy (без знижки, 5 %, 10 %) зареєстровано в контейнері, а користувач вводить суму покупки й бачить ціну з кожною знижкою.
2. Базовий рівень. Створити консольну програму з хостом, яка отримує всі стратегії знижок як IEnumerable<IDiscountStrategy> (сезонна, постійного клієнта, за сумою понад 5 000 грн), читає їхні відсотки з appsettings.json і застосовує найбільшу знижку до введеної суми.
3. Високий рівень. Створити застосунок із хостом «Знижки», який читає кошик (назва, ціна, кількість) із файлу JSON (аргумент --cart), застосовує стратегії знижок IDiscountStrategy (сезонна, постійного клієнта, за сумою), які вмикаються й вимикаються через конфігурацію, перевіряє відсотки (0–50) під час запуску, виводить таблицю позицій із підсумком і має модульні тести кожної стратегії.
Варіант 5. Бронювання переговорних
1. Початковий рівень. Створити консольну програму, у якій сервіс бронювання BookingService отримує через конструктор сховище IBookingRepository (Singleton, у пам’яті) і дозволяє забронювати кімнату на введені дату й годину, відхиляючи зайнятий час.
2. Базовий рівень. Створити консольну програму бронювання переговорних кімнат (кімната, дата, година), у якій кожна операція бронювання виконується в окремій області CreateScope зі Scoped-сервісом BookingContext, що накопичує зміни та зберігає їх наприкінці. Конфлікти бронювань записуються в журнал рівнем Warning, а програма виводить ідентифікатори екземплярів, щоб показати час життя.
3. Високий рівень. Створити застосунок із хостом «Переговорні», у якому список кімнат і робочі години задано в конфігурації, бронювання зберігаються у файлі JSON, команди book, cancel, list передаються аргументами, конфлікти й помилки журналюються, увімкнено ValidateScopes і є модульні тести перевірки конфліктів.
Варіант 6. Генератор звітів
1. Початковий рівень. Створити консольну програму, у якій форматувальники звіту IReportFormatter (CSV і текстова таблиця) зареєстровано в контейнері; програма виводить список студентів із середнім балом кожним форматувальником.
2. Базовий рівень. Створити консольну програму, яка формує звіт зі списком студентів і середнім балом: отримує всі форматувальники звіту як IEnumerable<IReportFormatter> (CSV, JSON, HTML), визначає потрібний за розширенням файлу, введеного користувачем, і зберігає звіт; для невідомого розширення виводиться список підтримуваних форматів.
3. Високий рівень. Створити застосунок із хостом «Звіти», який читає список студентів із середнім балом з CSV, формує звіти у форматах CSV, JSON, HTML (форматувальники – ключові сервіси, аргументи --in, --format, --out, --help), записує в журнал тривалість формування, повертає ненульовий код завершення в разі помилки і має модульні тести форматувальників.
Варіант 7. Нагадування про ліки
1. Початковий рівень. Створити консольну програму, у якій сервіс ReminderService отримує TimeProvider через конструктор і за списком годин прийому, заданим у програмі, виводить, скільки хвилин залишилося до наступного прийому.
2. Базовий рівень. Створити консольну програму з хостом, яка читає розклад прийому ліків (назва, години) з appsettings.json через шаблон параметрів, перевіряє години (0–23) і щохвилини записує в журнал нагадування, якщо настав час прийому.
3. Високий рівень. Створити застосунок із хостом «Ліки», який читає розклад прийому ліків (назва, години) з конфігурації, у фоновій службі з PeriodicTimer виводить нагадування, через IOptionsMonitor<T> підхоплює зміни розкладу без перезапуску, журналює пропущені прийоми рівнем Warning, а модульні тести з FakeTimeProvider перевіряють визначення наступного прийому.
Варіант 8. Моніторинг дискового простору
1. Початковий рівень. Створити консольну програму, у якій сервіс IDiskInfo (реалізація на DriveInfo) впроваджується в DiskReporter, що виводить для кожного готового диска вільне місце в гігабайтах і відсотках.
2. Базовий рівень. Створити консольний хост із BackgroundService, який кожні N секунд перевіряє вільне місце на дисках (DriveInfo), записує стан у журнал рівнем Information, якщо вільного місця менше за поріг, – Warning, а якщо менше за критичний поріг, – Critical; пороги й інтервал читаються з конфігурації з перевіркою.
3. Високий рівень. Створити застосунок із хостом «Диски», який періодично перевіряє вільне місце на дисках через сервіс IDiskInfo (реалізація на DriveInfo); список дисків і пороги задано в конфігурації, формат журналу (simple або json) обирається в appsettings.json, під час зупинки виводиться таблиця мінімального вільного місця за сеанс, а модульні тести з фейковим IDiskInfo перевіряють рівні тривог.
Варіант 9. Нарахування зарплати
1. Початковий рівень. Створити консольну програму, яка читає погодинну ставку й відсоток податку з appsettings.json за допомогою IConfiguration і для введеної кількості годин виводить нараховану суму, податок і суму до виплати.
2. Базовий рівень. Створити консольну програму з хостом, яка для введених посади й кількості годин виводить нараховану суму, податок і суму до виплати; ставки посад (інженер, технік, оператор) і податок зв’язано з класом параметрів, а перевірка ValidateDataAnnotations і ValidateOnStart не дає запустити програму зі ставкою поза межами 50–2 000 грн або податком понад 50 %.
3. Високий рівень. Створити застосунок із хостом «Зарплата», який читає табель із CSV (працівник, посада, години; аргумент --file), обчислює зарплату за ставками посад із конфігурації з понаднормовими годинами (коефіцієнт із конфігурації), виводить таблицю з підсумками, журналює рядки з помилками і має модульні тести сервісу розрахунку.
Варіант 10. Шкільний дзвінок
1. Початковий рівень. Створити консольну програму, яка читає розклад дзвінків (початок і кінець уроків) з appsettings.json у клас параметрів і для введеного часу виводить номер поточного уроку або «перерва».
2. Базовий рівень. Створити консольний хост із фоновою службою, що читає розклад дзвінків (початок і кінець уроків) з appsettings.json, щосекунди перевіряє час і записує в журнал «Дзвінок на урок N» або «Дзвінок з уроку N»; розклад перевіряється під час запуску (уроки не перетинаються, кінець пізніше за початок).
3. Високий рівень. Створити застосунок із хостом «Дзвінок», фонова служба якого записує в журнал дзвінки на урок і з уроку за розкладом для будніх днів і суботи з JSON-файлу; зміни файлу підхоплюються через IOptionsMonitor<T> із записом у журнал, а модульні тести з FakeTimeProvider перевіряють визначення уроку в межових моментах.
Варіант 11. Облік парковки
1. Початковий рівень. Створити консольну програму, яка читає вартість години парковки з appsettings.json і для введених часу в’їзду та виїзду виводить вартість, округлюючи неповну годину вгору.
2. Базовий рівень. Створити консольну програму з хостом, яка для введених часу в’їзду й виїзду виводить вартість парковки (неповна година округлюється вгору) з перевіркою формату часу; тариф задано в appsettings.json, а для середовища Development файл appsettings.Development.json встановлює нульову вартість; програма виводить назву середовища.
3. Високий рівень. Створити застосунок із хостом «Парковка» з денним і нічним тарифами, безкоштовними першими хвилинами і добовим максимумом з конфігурації, командами enter, exit, report через аргументи, збереженням сесій у JSON, журналом операцій і модульними тестами розрахунку з FakeTimeProvider.
Варіант 12. Перевірка паролів
1. Початковий рівень. Створити консольну програму, у якій сервіс PasswordValidator отримує через конструктор мінімальну довжину з IOptions<PasswordOptions> і перевіряє введений пароль.
2. Базовий рівень. Створити консольну програму з хостом, яка перевіряє введені паролі за політикою (довжина, цифри, великі літери, спецсимволи) з конфігурації, записує результат кожної перевірки в журнал без самого пароля, а порушені правила виводить списком.
3. Високий рівень. Створити застосунок із хостом «Політика паролів», який перевіряє паролі з файлу (рядки логін;пароль, аргумент --file) за політикою з конфігурації, для середовищ Development і Production використовує різні політики, блокує користувача після N невдалих спроб, журналює події генератором [LoggerMessage] і має модульні тести правил.
Варіант 13. Імпорт замовлень
1. Початковий рівень. Створити консольну програму, у якій сервіс OrderImporter отримує ILogger<T> і читає замовлення з файлу CSV, записуючи в журнал кількість прочитаних рядків і рядки з помилками.
2. Базовий рівень. Створити консольний хост, фонова служба якого перевіряє папку вхідних файлів (шлях у конфігурації), імпортує нові файли CSV із замовленнями (номер, товар, кількість, ціна), переміщує їх у папку оброблених і записує журнал у форматі JSON (AddJsonConsole).
3. Високий рівень. Створити застосунок із хостом «Імпорт», який імпортує файли CSV із замовленнями (номер, товар, кількість, ціна) з папки вхідних файлів з повторними спробами (кількість і затримка в параметрах із перевіркою), переносить невдалі файли в папку помилок, використовує BeginScope з назвою файлу, коректно завершується за Ctrl+C і має модульні тести розбору рядків.
Варіант 14. Прогноз погоди
1. Початковий рівень. Створити консольну програму, у якій сервіс IWeatherProvider (фейковий з прогнозом на три дні) впроваджується в ForecastPrinter, що виводить прогноз для введеного міста.
2. Базовий рівень. Створити консольну програму з хостом, яка виводить прогноз погоди на три дні для введеного міста; фейковий і файловий (JSON) постачальники погоди зареєстровано як ключові сервіси, а потрібний обирається параметром Weather:Provider у конфігурації; для невідомого значення програма повідомляє про помилку.
3. Високий рівень. Створити застосунок із хостом «Прогноз», який через фейковий постачальник погоди IWeatherProvider виводить таблицю прогнозу на N днів (аргументи --city, --days, --help), кешує прогноз на час із конфігурації, журналює звернення до постачальника та має модульні тести кешу з фейковим постачальником і FakeTimeProvider.
Варіант 15. Кешування цін товарів
1. Початковий рівень. Створити консольну програму, у якій сервіс IPriceService повертає ціну товару за кодом (дані в словнику), а зареєстрований Singleton-сервіс підраховує кількість звернень і виводить її після серії запитів.
2. Базовий рівень. Створити консольну програму, у якій сервіс IPriceService повертає ціну товару за введеним кодом (дані в словнику), а декоратор CachedPriceService обгортає його, зберігає ціни на час із IOptions<T> і записує в журнал влучання й промахи кешу; реєстрацію виконано фабрикою в контейнері.
3. Високий рівень. Створити застосунок із хостом «Ціни», у якому повільний постачальник повертає ціну товару за кодом з імітованою затримкою, декоратор кешу має обмеження розміру й часу життя з конфігурації, наприкінці серії запитів виводиться статистика кешу, а модульні тести з FakeTimeProvider перевіряють застарівання записів.
Варіант 16. Черга друку
1. Початковий рівень. Створити консольну програму, у якій Singleton-сервіс PrintQueue зберігає завдання друку (назва документа, кількість сторінок), а PrintService додає введені користувачем завдання й виводить чергу.
2. Базовий рівень. Створити консольний хост, у якому Singleton-черга зберігає завдання друку (назва документа, кількість сторінок), а BackgroundService обробляє завдання із затримкою на сторінку з конфігурації, записує в журнал початок і завершення друку, а під час Ctrl+C дочікується поточного завдання.
3. Високий рівень. Створити застосунок із хостом «Принтер», який обробляє чергу завдань друку (документ, сторінки, пріоритет) з кількома принтерами (назви й швидкість у конфігурації), пріоритетами завдань, читанням завдань із файлу, коректним завершенням із записом необроблених завдань у JSON і модульними тестами черги з пріоритетами.
Варіант 17. Квитки в кіно
1. Початковий рівень. Створити консольну програму, у якій сервіс SeatService (схема залу 5 × 10 у пам’яті) отримує через конструктор ILogger<T> і бронює введене користувачем місце, журналюючи результат.
2. Базовий рівень. Створити консольну програму продажу квитків у кіно, у якій сервіси бронювання місць і оплати мають час життя Scoped і спільно використовують Scoped-об’єкт Order (сеанс, місця, сума) в межах однієї області покупки; програма виконує дві покупки в різних областях і показує, що замовлення не змішуються.
3. Високий рівень. Створити застосунок із хостом «Кінотеатр» із сеансами й цінами в конфігурації, покупкою кількох місць в одній області, фейковим платіжним сервісом, що відхиляє частину оплат, скасуванням бронювання в разі відмови, журналом подій і модульними тестами сервісу покупки.
Варіант 18. Лічильник відвідувань
1. Початковий рівень. Створити консольну програму, у якій Singleton-сервіс VisitCounter і Transient-сервіс PageHandler зареєстровано в контейнері; програма обробляє введені назви сторінок і виводить загальну кількість відвідувань.
2. Базовий рівень. Створити консольний хост, фонова служба якого імітує відвідування сторінок, а Singleton-статистика рахує відвідування кожної сторінки; під час зупинки хоста (IHostApplicationLifetime.ApplicationStopping) у журнал виводиться звіт.
3. Високий рівень. Створити застосунок із хостом «Статистика», який читає журнал відвідувань сторінок із файлу (рядки: час, сторінка), будує звіт за сторінками й годинами, зберігає його в JSON під час зупинки, дозволяє задати період через аргументи --from, --to і має модульні тести агрегації.
Варіант 19. Конвертер одиниць
1. Початковий рівень. Створити консольну програму, у якій конвертери довжини, маси й температури реалізують IUnitConverter і зареєстровані в контейнері; користувач вводить значення та вид конвертації.
2. Базовий рівень. Створити консольну програму, яка знаходить усі класи-конвертери одиниць (довжини, маси, температури), що реалізують IUnitConverter, скануванням збірки (Assembly.GetTypes), реєструє їх у контейнері та виводить меню доступних конвертацій з перевіркою введених значень.
3. Високий рівень. Створити застосунок із хостом «Конвертер» одиниць довжини, маси й температури, що підтримує аргументи --from, --to, --value, --list, --help, вмикає окремі конвертери параметрами конфігурації, повідомляє про невідомі одиниці в потік помилок із кодом завершення і має модульні тести всіх конвертерів.
Варіант 20. Контроль доступу
1. Початковий рівень. Створити консольну програму, яка читає список ролей і дозволених дій з appsettings.json через IConfiguration і для введених ролі та дії виводить «дозволено» або «заборонено».
2. Базовий рівень. Створити консольну програму з хостом, у якій сервіс AccessService отримує ролі з дозволеними діями через шаблон параметрів і для введених користувача, ролі та дії виводить «дозволено» або «заборонено», записуючи кожну спробу доступу в журнал (успішні – Information, відмови – Warning) з полями User і Action.
3. Високий рівень. Створити застосунок із хостом «Доступ», у якому ролі успадковують дозволи інших ролей, користувачі та паролі тестових облікових записів зберігаються в секретах користувача, після трьох невдалих входів обліковий запис блокується на час із конфігурації, а модульні тести перевіряють успадкування дозволів.
Варіант 21. Автополив рослин
1. Початковий рівень. Створити консольну програму, у якій фейковий датчик вологості IMoistureSensor впроваджується в WateringController, що для введеного значення вологості вирішує, чи вмикати полив (поріг 30 %).
2. Базовий рівень. Створити консольний хост із фоновою службою, що за розкладом із конфігурації перевіряє вологість кількох рослин фейковими датчиками та вмикає полив на задану тривалість, журналюючи кожне рішення.
3. Високий рівень. Створити застосунок із хостом «Автополив», контролер якого за показами фейкових датчиків вологості кількох рослин вирішує, чи вмикати полив; розклад, пороги й максимальний добовий обсяг води задано в перевірених параметрах, полив не виконується вночі, а модульні тести з FakeTimeProvider і фейковими датчиками перевіряють рішення контролера.
Варіант 22. Резервні копії документів
1. Початковий рівень. Створити консольну програму, яка читає шлях до папки документів і папки копій з appsettings.json і копіює всі файли .docx у папку копій, виводячи кількість скопійованих файлів.
2. Базовий рівень. Створити консольний хост, який копіює документи з папки документів у папку копій; шляхи й маска файлів задані в параметрах із перевіркою існування папки під час запуску, копіюються лише змінені файли, а результат кожного файлу записується в журнал.
3. Високий рівень. Створити застосунок із хостом «Резервування», який архівує документи з папки, заданої в конфігурації, у ZIP, надсилає архів у фейкове хмарне сховище з ключем доступу в секретах користувача, зберігає задану кількість копій, журналює результати й має модульні тести вибору змінених файлів.
Варіант 23. Облік робочого часу
1. Початковий рівень. Створити застосунок Windows Forms, у якому головну форму отримано з контейнера хоста, а сервіс ITimeTracker впроваджено через конструктор форми; кнопки Start і Stop фіксують робочий інтервал і показують його тривалість.
2. Базовий рівень. Створити застосунок Windows Forms із хостом для обліку робочого часу, у якому кнопки Start і Stop фіксують інтервали роботи над проєктом; назви проєктів і норма годин на день читаються з appsettings.json через IOptions<T>, інтервали показуються в DataGridView, а перевищення норми записується в журнал і показується в рядку стану.
3. Високий рівень. Створити застосунок Windows Forms «Робочий час» із хостом для обліку інтервалів роботи (проєкт, початок, кінець), у якому модальні форми додавання запису й звіту створюються контейнером, записи зберігаються в JSON-файл, звіт за тиждень експортується в CSV, дії журналюються, а сервіс підрахунку має модульні тести з FakeTimeProvider.
Варіант 24. Обмеження частоти запитів
1. Початковий рівень. Створити консольну програму, у якій Singleton-сервіс RateLimiter дозволяє не більше N запитів за хвилину (N у конфігурації); користувач натискає Enter, а програма виводить «дозволено» або «відхилено».
2. Базовий рівень. Створити консольну програму з хостом, у якій сервіс RateLimiter обмежує кількість запитів клієнта в ковзному вікні часу: отримує TimeProvider і параметри вікна з перевіркою, окремо рахує запити для кожного введеного ідентифікатора клієнта, виводить «дозволено» або «відхилено» та журналює відмови.
3. Високий рівень. Створити застосунок із хостом «Ліміти», який обмежує частоту запитів клієнтів у ковзному вікні часу з різними лімітами для груп клієнтів у конфігурації, імітацією потоку запитів фоновою службою, звітом про відхилені запити під час зупинки та модульними тестами з FakeTimeProvider для меж вікна.
Варіант 25. Розсилка новин
1. Початковий рівень. Створити консольну програму, у якій сервіс Newsletter отримує IMailSender через конструктор і надсилає введений текст списку адрес; у програмі використовується фейковий відправник, що виводить листи на консоль.
2. Базовий рівень. Створити консольну програму з хостом, яка надсилає введений текст новин списку адрес через фейковий відправник (виводить листи на консоль); шаблон листа й адреса відправника читаються з конфігурації, а надсилання кожного листа журналюється в області BeginScope з ідентифікатором розсилки; некоректні адреси пропускаються з попередженням.
3. Високий рівень. Створити застосунок із хостом «Розсилка», який читає підписників із CSV, підставляє ім’я в шаблон, зберігає пароль SMTP у секретах користувача, обмежує кількість листів за хвилину, журналює результати й має модульні тести з фейковим відправником.
Варіант 26. Трекер посилок
1. Початковий рівень. Створити консольну програму, у якій фейковий сервіс перевізника ICarrier повертає статус посилки за номером, а TrackingService виводить статус для введеного номера.
2. Базовий рівень. Створити консольну програму, яка отримує всіх фейкових перевізників як IEnumerable<ICarrier> (повертають історію статусів посилки за номером), визначає перевізника за форматом введеного номера посилки (префікс у конфігурації) і виводить історію статусів; невідомий формат спричиняє повідомлення про помилку.
3. Високий рівень. Створити застосунок із хостом «Трекер посилок», фонова служба якого періодично опитує фейкових перевізників ICarrier для списку посилок із JSON, журналює зміни статусів, зберігає останні статуси у файл і має модульні тести визначення перевізника за форматом номера.
Варіант 27. Енергоспоживання будинку
1. Початковий рівень. Створити консольну програму, у якій сервіс IMeter (фейковий лічильник) впроваджується в EnergyReport, що для десяти показів виводить споживання між сусідніми показами в кВт·год.
2. Базовий рівень. Створити консольний хост із фоновою службою, що накопичує покази фейкових лічильників кількох приладів і щохвилини записує в журнал сумарне споживання; тариф за кВт·год читається з конфігурації з перевіркою.
3. Високий рівень. Створити застосунок із хостом «Енергія», який накопичує покази фейкових лічильників кількох приладів і агрегує їх за годинами, повідомляє генератором [LoggerMessage] про перевищення добового ліміту з конфігурації, під час зупинки зберігає звіт у CSV з вартістю за двозонним тарифом і має модульні тести агрегації.
Варіант 28. Розрахунок податків
1. Початковий рівень. Створити консольну програму, яка читає ставки податку на доходи й військового збору з appsettings.json і для введеного доходу виводить суму податків і чистий дохід.
2. Базовий рівень. Створити консольну програму з хостом, яка для введених року й доходу виводить суму податків і чистий дохід; правила оподаткування (ставки податку на доходи й військового збору) для кількох років задано в конфігурації (масив розділів), а перевірка параметрів під час запуску не дозволяє від’ємних ставок і повторених років.
3. Високий рівень. Створити застосунок із хостом «Податки», який обчислює податки для списку доходів із CSV (аргументи --file, --year), виводить таблицю з підсумками, журналює рядки з помилками, повертає код завершення 2 для невідомого року і має модульні тести правил.
Варіант 29. Ігрові кімнати
1. Початковий рівень. Створити консольну програму, яка читає назви ігрових кімнат і максимальну кількість гравців з appsettings.json у клас параметрів і виводить список кімнат.
2. Базовий рівень. Створити консольну програму з хостом, у якій Singleton-сервіс ігрових кімнат (назви й ліміт гравців у конфігурації) додає введених гравців у кімнати з урахуванням ліміту, а кожна подія (вхід, вихід, відмова) журналюється з полями Player і Room.
3. Високий рівень. Створити застосунок із хостом «Ігрові кімнати» (назви й ліміти гравців у конфігурації) з командами join, leave, list через аргументи, фоновою службою, що видаляє неактивних гравців після тайм-ауту з конфігурації, збереженням стану в JSON під час зупинки і модульними тестами з FakeTimeProvider.
Варіант 30. Локалізація інтерфейсу
1. Початковий рівень. Створити консольну програму, яка читає код культури (uk-UA або en-US) з appsettings.json і виводить привітання, дату та число у форматі цієї культури.
2. Базовий рівень. Створити консольну програму з хостом, яка виводить привітання та повідомлення програми вибраною мовою: сервіс ITextProvider повертає тексти за ключами з JSON-файлів мов, мова обирається параметром конфігурації або аргументом командного рядка, а відсутній ключ записується в журнал рівнем Warning.
3. Високий рівень. Створити застосунок Windows Forms із хостом «Локалізація», у якому мова інтерфейсу береться з IOptionsMonitor<T> і змінюється без перезапуску після зміни appsettings.json, тексти форм оновлюються, а модульні тести перевіряють пошук текстів із запасною мовою.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань.
- Спроєктувати інтерфейси сервісів свого варіанта, визначити час життя кожного сервісу та розділи конфігурації; записати їх у звіт.
- Створити проєкт (Console App, Worker Service або Windows Forms App з хостом), зареєструвати сервіси в
Program.csі отримувати залежності лише через конструктори. - Винести налаштування в
appsettings.jsonі класи параметрів із перевіркою під час запуску; секрети зберігати в секретах користувача, а не у файлах проєкту. - Додати журналювання з шаблонами повідомлень і перевірити роботу застосунку в середовищах Development і Production, зі змінними середовища та аргументами командного рядка.
- Для рівнів 2 і 3 написати модульні тести з фейковими залежностями.
- Продемонструвати роботу застосунку викладачеві, пояснити програмний код і відповісти на контрольні питання.