proninp / Edu

Education
0 stars 0 forks source link

Предложения по улучшению #28

Closed oshakhmatov closed 1 month ago

oshakhmatov commented 1 month ago

1 возвращаемый тип здесь не должен быть nullable 2 и на следующих строчках лучше писать var как и везде 3 тут лучше использовать инициализатор массива и далее при помощи Select из LINQ преобразовать числа в таски вот так:

var tasks = Enumerable.Range(start: startIndex, count: endIndex - startIndex + 1)
        .Select(i => GetSinglePost(i))
        .Where(postTask => postTask is not null)
        .ToList();

4 тут лучше опять же использовать var и платформонезависимый Path.Combine потому что слэши на линукс и виндоус разные var fileName = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "posts.txt")); 5 тут лучше использовать интерполяцию вместо форматирования. Она быстрее и лучше оптимизирована в .NET 8, будет выглядеть вот так: var url = $"https://jsonplaceholder.typicode.com/posts/{postId}"; 6 вместо ручной десериализации лучше использовать готовый HttpClient.GetFromJsonAsync<T> 7 лучше всегда писать явно, то есть null здесь 8 лучше добавить еще и проверку файла string.IsNullOrEmpty(fileName) 9 тут нужно var вместо явного типа (для однообразия и краткости), а также использовать именованный аргумент для значения false так как по исходному кода не понятно, что именно мы указываем как false (нужно argName: false) 10 а вообще лучше использовать вот такую более короткую запись, которую обеспечивает встроенный метод у File:

var lines = posts.Select(post => post.ToString());
await File.WriteAllLinesAsync(fileName, lines, Encoding.UTF8);
proninp commented 1 month ago

вместо ручной десериализации лучше использовать готовый HttpClient.GetFromJsonAsync

нашёл только такой метод:

await response.Content.ReadFromJsonAsync<Post>();
oshakhmatov commented 1 month ago

а это не оно? https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions.getfromjsonasync?view=net-8.0

oshakhmatov commented 1 month ago

но это так, просто для понимания, что такое есть ReadFromJsonAsync тоже хорошо

proninp commented 1 month ago

Увидел, спасибо! Если делать сразу:

return await client.GetFromJsonAsync<Post>($"https://jsonplaceholder.typicode.com/posts/{postId}");

то как понять, что IsSuccessStatusCode?

oshakhmatov commented 1 month ago

можно обернуть в try catch и ловить WebException (например сейчас обработки исключения нет и если будет например таймаут по одному из запросов - упадет все приложение)

oshakhmatov commented 1 month ago

try {} catch (WebException) {return null} например