Code review .NET web приложения (ASP.NET 7)

preview_player
Показать описание
В этом видео мы рассмотрим .NET web приложение, которое любезно предоставил Евгений. Я разберу основные ошибки, расскажу как его улучшить, как правильно сделать рефакторинг кода. Так же мы рассмотрим разные советы для улучшения кода.

00:00:00 - Вступление
00:01:20 - Про проект
00:02:30 - Введение
00:05:15 - Issues
00:07:45 - Pull request (PR)
00:09:13 - Action
00:12:10 - Сервер + БД / PR
00:15:55 - Milestones
00:16:50 - ReadMe
00:22:44 - Коммиты
00:28:52 - Разделение фронтенда/бэкэнда
00:31:00 - Про настройку CI/CD
00:32:50 - Про монолит
00:34:35 - Three-tier
00:37:48 - Clean architecture
00:44:10 - DDD
00:45:49 - Дублирование слов в методах/свойствах
00:49:30 - Guard clause
00:53:27 - Null vs Exception
00:59:27 - CancellationToken
01:00:20 - Async в названии
01:00:50 - Nullable (pvs-studio)
01:04:41 - Интерфейсы
01:07:55 - Сущности (entity)
01:19:20 - Data слой
01:19:40 - Generic repository
01:20:53 - Specification pattern
01:23:55 - FirstOrDefault to Any
01:27:45 - Сокращаем имена/выносим репозитории
01:30:00 - ToLower
01:31:38 - Where + Any
01:32:41 - ToList
01:34:15 - AutoMapper
01:36:35 - Получение нужных колонок
01:41:20 - Фильтрация через обьект
01:42:50 - Null (??)
01:14:50 - Один Where
01:46:00 - Оптимизация обновления
01:47:40 - Необязательный Where
01:48:30 - SOLID (ISP)
01:49:10 - string to enum
01:51:28 - Удаление по id
01:53:15 - Неправильное условие
01:55:40 - UnitOfWork
02:00:17 - Ef vs Dapper
02:03:00 - Обработка исключений
02:07:07 - JsonSerializerOptions
02:08:00 - DTO
02:12:22 - enum Нумерование
02:16:05 - Вспомогательные классы
02:20:27 - Константы
02:23:00 - Сервисы
02:25:30 - Jwt
02:26:40 - SignalR
02:32:38 - REST
02:44:25 - Выводы

Clean architecture:
DDD:
Microservices:
Выбрать только нужные колонки без .Select():

*Контакты*

#ityoutubersru #ityoutubers #it #kurnakovv #программирование #программист #aspnetcore #dotnet #csharp #dotnetcore #aspnet #codereview #review #код_ревью #ревью #проверка_кода #проверка #refactoring #рефакторинг #github #гитхам #git #гит #issues #pull_request #actions #github_actions #milestones #github_milestones #eshoponweb #in_memory_db #render #commit #коммит #three_tier_architecture #трех_уровневая_архитектура #clean_architecture #architecture #чистая_архитектура #uncle_bob #дядя_боб #clean_code #чистный_код #microsoft #ddd #microservices #микросервисы #guard_clause #exception #error_handling #обработка_исключений #исключения #cancellation_token #nullable #pvs_studio #dry #generic_repository #repository #репозиторий #specification_pattern #паттерн_спецификация #postgresql #postre #efcore #collate #case_insensitive #query #db #select_specific_fields #unitofwork #unit_of_work #jsonserializeroptions #constants #environment_variables #константы #переменные_окружения #rest #рест #kurnakovv #kurnakov
Рекомендации по теме
Комментарии
Автор

Ребят, я не думал, что видео многим понравится и будет столько просмотров! Всем большое спасибо за просмотр и за слова поддержки в комментариях, и в личке :)
Так же спасибо за критику и подсказки. Появилось очень много тем для видео, постараюсь всё снять как можно лучше и качественнее.

Так же, если вы не хотите потерять меня в случае блокировки YouTube, я так же выкладываю видео на рутубе и в вк видео, это видео я уже выложил:

P.S. Ребят, ютуб очень не стабильно работает, иногда просто не могу зайти на него, FYI :(

kurnakovv
Автор

крутой видос, го ещё такое, думаю много кто будет готов даже заплатить за обзор

opomomlslsa
Автор

Насчёт таймкода "Сущности (entity)" про хранение связных свойств в отдельной сущности и брать их через джойны, можно этого избежать используя Owned Types в ef core или Complex types в ef. То есть мы улучшим организацию в коде сохраняя структуру таблицы.

ketni
Автор

Просто вау, классный качественный контент, очень рад что наткнулся на твой канал)

karmraks
Автор

Было бы классно увидеть как с нуля создаём бэкенд часть какого нибудь приложения

aniband
Автор

1:24:00 А там обязательно нужен тот Include в appEvent, можно ведь и без него обойтись?

yuroon
Автор

На счет IQuerable не совсем ясно, в чем же там нарушение архитектуры? То есть если мы сделаем в репозитории ToList(), втащим в память пол таблицы или всю таблицу (строк так на несколько сотен тысяч), а потом будем фильтровать ее в памяти сервера, то это лучше чем дать возможность клиентам репозитория добавить свое выражение, которое конкретная ОРМ транслирует в SQL и отдаст с сервера баз данных минимально необходимый результат? Оно то конечно можно соорудить метод типа ByCriteria<TEntity>(Expression<>), но тогда нужно за собой таскать сам репозиторий до самого того места, где клиент уже может построить выражение. А могли бы просто отдать кверабельный обьект и пусть потребитель кверяет на здоровье. Собствено в таком виде, например, DbSet<T> в ентити фреймворке и организованы, но люди зачем-то старательно прячут его за енумерейбл и листами.

yuriy.kostenko
Автор

2:15:40 это разве не связано с [Flags] аттрибутом?

speedcuber
Автор

Нельзя говорить что ЮнитОфВорк и репозитории зло. Всегда всё зависит от ситуации! Если в вашей ситуации ЮнитОфВорк излишен а вы его применяете, это ваши проблемы, а не паттерна

maflend
Автор

а типа return await это нормально?) Офигенное ревью ) я уже промолчу про другие моменты.

orhanaliyev
Автор

Интонации в речи режут слух, тяжеловато слушать...

timur
Автор

На налл оно прекрасно проверяет без всяких сторонних инструментов! Только вот автору надо понять почему именно оно указывет на возможный налл референс. ) А заставить его указывать на неочевидный налл очень просто! Инструмент совсем не кривой, как заявляет автор! И позволяет избежать множества неочевидных ошибок! )))

yuriy.kostenko