/
evsyukov.s
/
test
Обзор
Документация
Войти
/
evsyukov.s
/
test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/DicePoker.Core/Services/RecordsManagementService.cs
97 строк
3 KB
chernova.v
Улучшена работа сервисов
03 дек 2025, 10:39
03 дек 2025, 10:39
7be5746
Код
Авторство
О чём код?
using DicePoker.Core.Data.Abstractions; namespace DicePoker.Core.Services; /// <summary> /// Сервис для управления таблицей рекордов (бизнес-логика) /// </summary> public sealed class RecordsManagementService { private readonly IRecordsRepository _repository; private readonly int _topCount; public RecordsManagementService(IRecordsRepository repository, int topCount = 10) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _topCount = topCount > 0 ? topCount : throw new ArgumentOutOfRangeException(nameof(topCount)); } /// <summary> /// Получает топ-N рекордов (бизнес-логика: сортировка и фильтрация) /// </summary> public async Task<IReadOnlyList<RecordEntry>> GetTopRecordsAsync() { var allRecords = await _repository.GetAllAsync(); // Бизнес-логика: сортировка по очкам (убывание), затем по имени (возрастание) return allRecords .OrderByDescending(r => r.Score) .ThenBy(r => r.PlayerName) .Take(_topCount) .ToList(); } /// <summary> /// Добавляет рекорд и обновляет топ-N /// </summary> public async Task AddRecordAsync(string playerName, int score) { if (string.IsNullOrWhiteSpace(playerName)) throw new ArgumentException("Player name cannot be empty", nameof(playerName)); var entry = new RecordEntry(playerName.Trim(), score); // Получаем текущие рекорды var currentRecords = await _repository.GetAllAsync(); var updatedRecords = currentRecords.ToList(); updatedRecords.Add(entry); // Бизнес-логика: оставляем только топ-N var topRecords = updatedRecords .OrderByDescending(r => r.Score) .ThenBy(r => r.PlayerName) .Take(_topCount) .ToList(); // Сохраняем обновленный список await _repository.SaveAllAsync(topRecords); } /// <summary> /// Очищает всю таблицу рекордов /// </summary> public Task ClearRecordsAsync() { return _repository.ClearAsync(); } /// <summary> /// Получает статистику рекордов /// </summary> public async Task<RecordsStatistics> GetStatisticsAsync() { var records = await _repository.GetAllAsync(); if (records.Count == 0) { return new RecordsStatistics(0, 0, 0, null); } return new RecordsStatistics( TotalRecords: records.Count, HighestScore: records.Max(r => r.Score), AverageScore: (int)records.Average(r => r.Score), TopPlayer: records.OrderByDescending(r => r.Score).First().PlayerName ); } } /// <summary> /// Статистика рекордов /// </summary> public sealed record RecordsStatistics( int TotalRecords, int HighestScore, int AverageScore, string? TopPlayer );