Назад к вопросам
Middle+
3
К вам на Code Review попала задача коллеги Какие проблемы в коде вы видите? ```csharp namespace SomeProject.Data { public class UserRepository { public Task SaveUser(User user, Dictionary<int,string> shards) { var shardIdx = user.Id % 3; var shardAddress = shards[shardIdx]; using(var shardService = new ShardService(shardAddress)) { return shardService.SaveUserAsync(user); } } } } ```
Компании, где спрашивали
Core outstaff
Ответ от нейросети
sobes.tech AI
В представленном коде можно выделить несколько проблем:
-
Неправильное использование
usingс асинхронным методом- Метод
SaveUserвозвращаетTask, но внутри используетсяusingдляshardService, который, вероятно, реализуетIDisposable. При этомshardService.SaveUserAsync(user)возвращает задачу, которая может выполняться после выхода из блокаusing, что приведёт к попытке использовать уже освобождённый объект.
- Метод
-
Отсутствие асинхронного модификатора и
await- Метод должен быть объявлен как
async Task, и вызовSaveUserAsyncнужноawait-ить, чтобы корректно дождаться завершения операции перед освобождением ресурсов.
- Метод должен быть объявлен как
-
Жёстко заданное число шардов
- В коде жёстко задано число 3 при вычислении
shardIdx. Лучше использовать размер словаряshards.Countдля гибкости.
- В коде жёстко задано число 3 при вычислении
-
Отсутствие обработки ошибок
- Нет обработки возможных исключений, например, если
shardIdxотсутствует в словаре или еслиSaveUserAsyncвыбросит исключение.
- Нет обработки возможных исключений, например, если
Исправленный пример:
public async Task SaveUser(User user, Dictionary<int, string> shards)
{
var shardIdx = user.Id % shards.Count;
if (!shards.TryGetValue(shardIdx, out var shardAddress))
throw new KeyNotFoundException($"Shard index {shardIdx} not found.");
using(var shardService = new ShardService(shardAddress))
{
await shardService.SaveUserAsync(user);
}
}
Таким образом, метод становится асинхронным, корректно ожидает завершения операции и безопасно освобождает ресурсы.