Обложка канала

codaza. Страница 3

206 @codaza

Канал о разработке на платформе .NET с использованием языка программирования C#. Рассматриваются актуальные подходы и современные методологии разработки.

  • codaza

    #codaza_спрашивает Всем привет! 👋 Сижу я сегодня за компом, спокойно себе отмечаю день пельменей (сегодня день пельменей, если вы не знали) и мне звонит мой хороший знакомый Junior-разработчик Леонид. Лёня, рыдая в трубку, говорит: Уже который раз отклоняют merge в master с пометкой: 'Просадка в производительности'. Я посмотрел код, Лёня там чё-то шифрует-перешифрует.. наверное, ему так надо. Я ничего не понял, сказал что у меня в группе codaza отличные ребята и девушки, они точно разберутся, где у тебя там просадка в производительности. Поможем Леониду? Или спасение утопающих — дело рук самих утопающих?
  • codaza

    Всем привет! 👻 Продолжаем разбираться с LINQ и сегодня на повестке: группировка данных с помощью операции GroupBy. Если вы еще никогда не делали группировку данных, то этот гайд будет для вас красной ковровой дорожкой 🪄 Приятного просмотра! 💙 https://youtu.be/G7ytatcF7GY
    C# LINQ GroupBy

    В ролике рассмотрим использование LINQ для выполнения группировки данных с помощью операции Group By. Поговорим о том, зачем вообще нужно делать Group By. Посмотрим на суть через призму Transact SQL. Сделаем Group By в двух синтаксисах LINQ - Query Syntax и Method Syntax. Ролик LINQ Left Join: https://youtu.be/nObBd7cqpTQ Telegram: https://t.me/codaza Кофе: https://pay.cloudtips.ru/p/179d0532 0:00 - Начало 1:03 - Концепт GroupBy 2:19 - GroupBy в Transact SQL 4:56 - GroupBy в LINQ (Query Syntax) 6:54 - GroupBy в LINQ (Method Syntax) #linq #csharp #net6 #сишарп #codaza

    YouTube
  • codaza

    #капитану_на_заметку Очень часто, если коллекция не содержит искомых элементов, разработчик принимает решение вернуть null. Такое может быть, когда возвращается пустая выборка из БД, коллекция не может быть сгенерирована ввиду ошибочных условий и т. д. Подобное решение приводит к избыточным проверкам во внешнем коде, а также повышает вероятность появления исключения NullReferenceException. Хорошим тоном является возврат пустых коллекций. Старайтесь не возвращать null, когда ваши коллекции не содержат элементов ✅
  • Реклама

  • codaza

    Очень круто получилось с последним вопросом! Сейчас расскажу 🙂 Я хотел сделать основной фокус на отложенном выполнении (Deferred Execution) запросов в LINQ. Что значит “отложенное выполнение”? А это значит, что LINQ-запрос будет исполнен только там, где будет востребован непосредственный результат его выполнения. На 3-ей строке мы не получаем непосредственный результат выполнения, так как переменная result имеет тип IQueryable<Trades>. Проще говоря, мы только определили некоторый запрос, результат выполнения которого, нам потребуется в будущем. Где же мы получаем результат? А получаем мы его на строках 8, 9 и 10. То есть, мы обращаемся к базе данных аж 3 раза. Если вы не делаете лабу для универа, то это непозволительная роскошь для профессиональной разработки. Как избежать трехкратного обращения к базе данных? Очень просто, нужно сразу запросить результат путём вызова метода ToList(). Таким образом, на 8, 9 и 10 строках, мы будем оперировать с данными, которые будут находиться в оперативной памяти и за ними не нужно “ходить” в базу данных. Подписчик Руслан Петряев дал точный ответ в комментариях 👍 Кроме того, Руслан увидел еще одну проблему, которая была вызвана запросом приведения к List. Посмотрите на код, а нужен ли нам вообще этот List? Ведь нам совершенно не нужны данные из этого списка. Всё что нам нужно – это общее число отфильтрованных записей, минимальная и максимальная цены. Тогда зачем мы держим эти данные в оперативной памяти? Всё что нам нужно по логике метода: 1. Обратиться к базе данных. 2. Забрать Count, MinPrice и MaxPrice для отфильтрованных записей. 3. Сохранить данные в объект TradeData и вернуть его. Это можно сделать так: TradeData result = DbContext.Set<Trades> .Where(t => t.Status == TradeStatuses.Completed) .GroupBy(t => t.Status == TradeStatuses.Completed) .Select(t => new TradeData { PricesCount = t.Count(), PriceMin = t.Min(r => r.Price), PriceMax = t.Max(r => r.Price) }).FirstOrDefault(); Супер! От вопроса получилась двойная польза для всех! Всем хорошего вечера! 👋
  • codaza

    #codaza_отвечает
  • codaza

    #codaza_спрашивает "Пятница, она уже не работница, но еще и не отпускница, — одним словом, ожидательница.” (с) Джон Стейнбек Всем привет! 👋 Я уже практически убежал катать на склон, как меня попросили по-быстрому провести код-ревью junior-разработчика. В целом, всё норм, но с этим кусочком кода что-то не так. Или всё так... 🤯 Будем апрувить? 🤔
  • codaza

    Как проходят ваши выходные? Надеюсь, вы проводите их классно и не за компом 😉 Я не стал рисковать и пулять код из предыдущего поста в продакшн, так как DevOps'ы точно нашли бы меня и прижали к стенке, а я хотел спокойно отдохнуть в эти выходные. Они могли это сделать из-за того, что микросервис мог начать потреблять больше памяти, чем планировалось. Если вы присмотритесь к коду, то в самом начале (на 5-ой строке), мы смотрим на готовность коллекции к процессингу и, если она не готова, то возвращаем 0 обработанных записей. Из-за этого, нам совершенно не нужна аллокация памяти под Task, так как мы и не планировали ожидать результат выполнения метода SaveAsync() (строка 6). В таких случаях применяют ValueTask, что позволяет избежать избыточных аллокаций. Если наш hot path (горячий путь) будет чаще идти туда, где коллекция не готова к процессингу (строка 4), то сокращение потребляемой память может порадовать ваших DevOps'ов до умопомрачения. Для высоконагруженных систем это будет очень ощутимой оптимизацией. Хорошего начала рабочей недели 👋
  • codaza

    #codaza_отвечает
  • codaza

    #codaza_спрашивает Всех с пятницей! 🥤 Пока мчитесь до паба, у меня небольшой кусочек кода для вас. Код вроде рабочий, но.. может еще что-нибудь эдакого добавить\удалить\изменить\оптимизировать? Или так в продакшн пульнём? Жду идеи в комментариях 😊
  • codaza

    Всем привет! 👻 Если всё еще путаетесь c Left Join в LINQ, то ловите гайд, который поможет распутаться раз и навсегда 😀 Приятного просмотра! https://youtu.be/nObBd7cqpTQ
    C# LINQ Left Join

    В ролике рассмотрим использование LINQ для выполнения Left Join. Поговорим о том, зачем вообще нужно делать Left Join. Посмотрим на суть связки через призму Transact SQL. Сделаем Left Join в двух синтаксисах LINQ - Query Syntax и Method Syntax. Telegram: https://t.me/codaza Кофе: https://pay.cloudtips.ru/p/179d0532 0:00 - Начало 0:44 - Концепт Left Join 3:05 - Left Join в Transact SQL 4:41 - Left Join в LINQ (Query Syntax) 7:40 - Left Join в LINQ (Method Syntax) #linq #csharp #net6 #ityoutubers #codaza

    YouTube
  • codaza

    #codaza_отвечает С кодом из предыдущего поста не всё ок. Ему не хватает асинхронности. Если не ожидать результат выполнения метода GetStringAsync() у объекта client (строка 5), то его освобождение из памяти произойдет раньше, чем выполнится метод, так как мы используем using (строка 3). Поэтому, перед dispose объекта client, нам необходимо дождаться результата выполнения метода, а не просто возвращать task. Подписчик Aidar дал точный ответ в комментариях 👍
  • codaza

    #codaza_спрашивает Как думаете, с кодом всё ок? 🤔 Это вам, чтобы после НГ немного в себя прийти 😉
  • codaza

    🎄Вы уже нарядили ёлку? Если нет, то скорее ловите 30-ти секундный гайд https://youtu.be/PIMVMkU-9rw
    C# Christmas Tree за 30 секунд #Shorts

    Рисуем ёлку в консоли на C# за 30 секунд

    YouTube
  • codaza

    ASP.NET Dependency Injection Lifetimes | Время жизни сервисов

    Регистрация сервисов в DI контейнере ASP.NET Core может проводиться с различным времени жизни. В ролике мы поговорим о возможных вариантах регистрации, посмотрим на различия и нюансы, а также коснемся лучших практик использования. Живой пример сделаем в Visual Studio 2022 и .NET 6. Будет интересно 🙂 Исходный код проекта на GitHub: https://github.com/codaza/DIRegistrationLifetimesTest Telegram канал: https://t.me/codaza На кофе ☕️: https://pay.cloudtips.ru/p/179d0532 0:00 - Начало 1:00 - Dependency Injection и DI Container 4:54 - Registration Lifetimes: Singleton, Scoped, Transient 9:49 - Live example (Visual Studio 2022, .NET 6) 24:00 - Лучшие практики применения Singleton, Scoped, Transient #DependencyInjection #AspNet #CSharp #net6 #codaza #ityoutubers #ITubeTeam

    YouTube
  • codaza

    30% - ровно такой процент кандидатов не отвечает на один из ключевых вопросов касающихся разработки на ASP.NET. Данная цифра взята из моего личного опыта проведения технических интервью. Как правило, кандидаты дают неполный ответ, неправильный ответ или не отвечают вовсе (и такое бывает). Что это за вопрос? Узнаем завтра 😉 На повестке ASP.NET! Нескучной пятницы и до завтра! 🥤
  • Реклама

  • codaza

    C# Factory Method Фабричный Метод | Design Patterns

    Паттерны проектирования важно и нужно знать. В этом ролике мы поговорим про design pattern Factory Method (Фабричный метод) - порождающий шаблон проектирования. Поговорим о сути, посмотрим на примеры и сделаем реализацию в Visual Studio 2022 и .NET 6. Заходите, будет интересно и станет понятно 🙂 Исходный код проекта на GitHub: https://github.com/codaza/FitnessClub На кофе ☕️: https://pay.cloudtips.ru/p/179d0532 Telegram канал: https://t.me/codaza 0:00 - Начало 0:48 - Factory Method это порождающий паттерн 1:25 - Концепция Factory Method 6:52 - Недостатки Factory Method 8:07 - Анатомия Factory Method 9:59 - Live example 10:52 - Пример: Создаём проект в Visual Studio 2022 (.NET6) 11:18 - Пример: Создаём абонементы 16:47 - Пример: Создаём фабрики 22:24 - Пример: Используем фабрики в клиентском коде 32:33 - Завершение #factorymethod #designpatterns #ityoutubers #ITubeTeam #gof #csharp #net6 #паттерныпроектирования #codaza

    YouTube