Волны ИИ
1.39K subscribers
430 photos
4 videos
5 files
324 links
Творчество искусственного интеллекта.
Download Telegram
🔥 Traversals: как из IEnumerable<Task<Foo>> сделать Task<IEnumerable<Foo>>

Представьте, что у вас есть коллекция идентификаторов и метод, возвращающий асинхронный результат:

public static Task<Foo> Read(int id);


Если вы вызовете этот метод для всех элементов коллекции, вы получите IEnumerable<Task<Foo>>. Однако работать с таким типом неудобно. Желаемый результат — это Task<IEnumerable<Foo>>.

В качестве решения можно использовать Traversals. Они полезны, когда нужно менять порядок вложенных структур данных, что облегчает работу с асинхронными вычислениями и сложными вложенными типами. В .NET это особенно актуально при работе с Task.

👉 Подробнее
⚙️🚦 Лучшие практики для тестирования асинхронного кода

Часто в погоне за производительностью мы забываем про важный аспект — тестирование. Асинхронный код может скрывать множество подводных камней: от скрытых исключений до проблем с многопоточностью. Даже если ваш код компилируется и работает, это не значит, что он свободен от ошибок, особенно в сценариях высокой нагрузки или работы с внешними сервисами.

1. Тестовые методы тоже должны быть асинхронными
Асинхронные методы нельзя правильно протестировать синхронно. Чтобы избежать неожиданных ошибок, всегда пишите тесты с async и возвращайте Task. Это позволяет тестовому фреймворку дождаться завершения всех операций и корректно обработать результат.

2. Не игнорируйте исключения
Асинхронный код может выбрасывать исключения, которые на первый взгляд не будут видны. Например, вызов метода может завершиться через await, но исключение «упаковано» и не проявится в вашем тесте. Используйте методы вроде Assert.ThrowsExceptionAsync, чтобы убедиться, что ваши тесты обрабатывают такие ситуации.

3. Следите за состоянием
Асинхронный код часто запускается в многопоточной среде. Это значит, что тестируемый код может обращаться к разделяемым ресурсам, например, коллекциям, файлам или базам данных. Убедитесь, что такие ресурсы правильно изолированы или настроены для работы с несколькими потоками.

4. Не забывайте про тайм-ауты
В реальных приложениях асинхронные операции могут зависнуть из-за внешних факторов: сеть стала недоступна, база данных не отвечает. Добавление тайм-аутов в тесты гарантирует, что тест не будет висеть вечно, если что-то пойдет не так. Например, устанавливайте предел времени на выполнение асинхронного метода и заверяйте, что он укладывается в него.

5. Используйте моки для зависимостей
Асинхронный код часто зависит от внешних сервисов, например, API или базы данных. Вместо того, чтобы тестировать реальную интеграцию, создавайте «заглушки» (моки), которые имитируют поведение этих сервисов. Это делает тесты быстрее и надежнее.
Value Object — это объект, который описывает значение или набор связанных значений. Он не имеет уникального идентификатора, и если два таких объекта содержат одинаковые данные, они считаются одинаковыми.

Например, адрес, сумма денег или цвет — это Value Objects. Они нужны, чтобы сделать код понятнее и безопаснее: вместо использования обычных строк или чисел, вы создаёте объект, который отражает смысл данных.

Зачем использовать Value Object?

Читаемость и выразительность кода. Вместо использования примитивных типов (string, decimal) создаются объекты, которые лучше отражают смысл данных.

Инкапсуляция бизнес-логики. Value Object может содержать валидацию данных, упрощая проверку их корректности на этапе создания.

Неизменяемость для безопасности. Объект остаётся неизменным после создания, что упрощает отладку и повышает предсказуемость.
Как управлять функциональностью приложения без повторного развертывания?

Feature flags открывают новые горизонты: они позволяют включать или отключать функции в реальном времени, проводить A/B-тестирование и снижать риски при выпуске новых возможностей.

Статья погружает вас в мир feature flags на платформе .NET и C#, объясняет их преимущества и предлагает практическое руководство по внедрению.
Хотите узнать, как сделать свои приложения более гибкими и надежными?

📎 Читать статью
ref и out: в чём разница?

Вы когда-нибудь задумывались, в чём различие между ключевыми словами ref и out в C#? Оба позволяют передавать параметры по ссылке, но используют их по-разному:

ref: требует, чтобы переменная была инициализирована до передачи в метод. Метод может изменить её значение, но не обязан.

out: позволяет передавать неинициализированные переменные. Метод должен обязательно присвоить значение перед возвратом.

Если вы хотите углубиться в тему и понять, как правильно использовать эти ключевые слова, загляните в подробное объяснение с примерами кода:
👉 Читать источник
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания

Высокая latency — это скрытый враг, превращающий приложение в тормозящую телегу. Особенно в распределённых системах, где данные путешествуют между серверами и каждая задержка становится катастрофой. Знаете ли вы, какие 8 стратегий помогут превратить "задумчивое" приложение в настоящего чемпиона?

Что эффективнее: кэшировать, сжимать или оптимизировать запросы к базе? А что, если правильный ответ — балансировка нагрузки или вообще CDN?

💡 Найдите недостающий элемент в вашем стеке и максимально ускорьте свои приложения.

🔗 Читать статью
🔗 Зеркало
⚙️⚙️ System.Threading.Channels

Каналы в C# — это мощный инструмент для организации обмена данными между производителями (producers) и потребителями (consumers). Канал можно представить как асинхронную очередь, которая связывает две стороны: одна записывает данные, а другая — их читает. Такой подход полезен, если данные генерируются в одном потоке, а обрабатываются в другом.

Основные компоненты каналов:
⚙️ ChannelWriter — отвечает за добавление данных в канал. Это «производитель».
⚙️ ChannelReader — отвечает за чтение данных из канала. Это «потребитель».
⚙️ Channel — объединяет Writer и Reader, предоставляя общий интерфейс для их взаимодействия.

Преимущества использования:
Работа с каналами основана на async/await, что упрощает интеграцию с другими асинхронными компонентами.
Низкоуровневое управление потоками и памятью делает их быстрее, чем использование классических очередей.
Поддерживает настройку поведения, например, фиксированный или неограниченный размер буфера.
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
⚙️ 🗒️ MemoryCache в C#: Зачем и как использовать
MemoryCache — это инструмент для хранения временных данных в оперативной памяти, что позволяет ускорить доступ к часто используемой информации. Это особенно полезно для веб-приложений, API или других программ, где важно снизить нагрузку на внешние источники данных (например, базы данных).

Основные возможности MemoryCache
⚙️ Быстродействие: Данные хранятся в памяти, поэтому доступны быстрее, чем при запросах в БД или файловую систему.
⚙️ Временное хранение: Вы можете настроить срок жизни данных (например, 5 минут или до определённого времени).
⚙️ Политики истечения:
Абсолютное истечение (Absolute Expiration): Данные удаляются по истечении указанного времени.
Скользящее окно (Sliding Expiration): Время истечения обновляется при каждом обращении к данным.
⚙️ Управление памятью: Ограничение общего объёма данных, чтобы не перегружать оперативную память.

Когда использовать MemoryCache?
Кэширование часто используемых данных: Например, результаты сложных запросов в базу данных, ответы сторонних API или статические файлы (настройки, конфигурации).
Улучшение производительности: Если ваши данные редко изменяются, кэширование уменьшает задержки на их повторное получение.
Локальные сценарии: MemoryCache используется для данных, которые актуальны только в текущем процессе (например, при работе на одном сервере).
Привет, друзья! 👋

Мы готовим статью об ИИ-инструментах для программирования в 2024 году и хотим услышать ваше мнение! 🤖💻 Поделитесь своим опытом и помогите нам сделать материал еще полезнее. Самые интересные ответы войдут в статью! 🏆
Не забудьте оставить комментарий с вашими мыслями об ИИ в программировании! Какие преимущества и недостатки вы видите? Какие инструменты рекомендуете попробовать коллегам? 🤔💬
🚀 CountBy: Новый метод LINQ в .NET 9, который упростит вашу жизнь

В .NET 9 команда Microsoft продолжает улучшать библиотеку LINQ, и одним из нововведений стал метод CountBy. Этот метод открывает новые горизонты для удобной и лаконичной работы с данными, позволяя эффективно группировать элементы и подсчитывать их количество.

🔍Что именно он делает?
- Группирует элементы по заданному ключу;
- Подсчитывает количество элементов в каждой группе;
- Возвращает результат в виде коллекции пар «ключ-значение».

Как это работало раньше? Пример с подсчётом букв в строке:

var charCounts = input
.Where(c => !char.IsWhiteSpace(c))
.GroupBy(c => c)
.Select(group => new { Key = group.Key, Count = group.Count() });


Ранее подобное можно было сделать через комбинацию методов GroupBy и Select, но CountBy делает этот процесс проще и менее подверженным ошибкам. Теперь это выглядит вот так:

var charCounts = input
.Where(c => !char.IsWhiteSpace(c))
.CountBy(c => c);
⚙️ gRPC против REST: что выбрать для вашего проекта?

⚙️ REST (Representational State Transfer): Архитектурный стиль взаимодействия, который основан на протоколе HTTP и обычно использует формат JSON или XML для передачи данных.
⚙️ gRPC (Google Remote Procedure Call): Фреймворк удаленного вызова процедур, построенный на основе HTTP/2 и использующий протокол сериализации Protocol Buffers (Protobuf).

Когда выбрать gRPC?
- Высокопроизводительные микросервисы с бо́льшим количеством запросов.
- Нужен стриминг данных в реальном времени.
- Система использует несколько языков программирования.
- Ограничения на пропускную способность или необходимость минимизировать задержки.

Когда выбрать REST?
- Простые CRUD-приложения, где производительность не критична.
- Высокая совместимость с веб-приложениями и стандартными клиентами.
- Простота разработки и отладки важнее строгой типизации.
- Нужна удобная документация и тестирование API.
⚙️ gRPC против REST: что выбрать для вашего проекта?

⚙️ REST (Representational State Transfer): Архитектурный стиль взаимодействия, который основан на протоколе HTTP и обычно использует формат JSON или XML для передачи данных.
⚙️ gRPC (Google Remote Procedure Call): Фреймворк удаленного вызова процедур, построенный на основе HTTP/2 и использующий протокол сериализации Protocol Buffers (Protobuf).

Когда выбрать gRPC?
- Высокопроизводительные микросервисы с бо́льшим количеством запросов.
- Нужен стриминг данных в реальном времени.
- Система использует несколько языков программирования.
- Ограничения на пропускную способность или необходимость минимизировать задержки.

Когда выбрать REST?
- Простые CRUD-приложения, где производительность не критична.
- Высокая совместимость с веб-приложениями и стандартными клиентами.
- Простота разработки и отладки важнее строгой типизации.
- Нужна удобная документация и тестирование API.
📜 ТОП-15 международных IT-сертификаций, которые увеличат твой доход в 2025 году

Хочешь знать, какие «корочки» реально поднимут твою зарплату? Исследование Skillsoft раскрыло ТОП-15 самых денежных IT-сертификаций. Спойлер: облака и безопасность рулят.

👉 Читать статью
📦 Что такое dotnet scaffold?
dotnet scaffold — это инструмент для быстрого создания компонентов, шаблонов проектов и приложений на основе ваших потребностей. Его главная цель — автоматизировать рутинные задачи, чтобы разработчики могли сосредоточиться на написании кода, а не на настройке окружения.

🛠️ Установка
Чтобы начать использовать инструмент, установите его через командную строку:
dotnet tool install --global Microsoft.dotnet-scaffold


⚙️ Как это работает?
1️⃣ Войдите в папку с вашим проектом.
2️⃣ Выполните команду:
dotnet scaffold


3️⃣ Вам будет предложено выбрать тип создаваемого объекта. Например:
- Web API
- Blazor
- Web App
4️⃣ Далее следуйте интерактивным подсказкам: выберите фреймворк, настройте маршруты или добавьте зависимости.
5️⃣ Инструмент автоматически сгенерирует необходимые файлы и обновит ваш проект.

Преимущества использования:
🚀 Интерактивность: Удобные подсказки помогают избежать ошибок при настройке.
🚀 Экономия времени: Генерация готовых к использованию шаблонов за считанные секунды.
🚀 Гибкость: Поддерживаются различные типы проектов, включая ASP.NET Core, Blazor и даже кастомные шаблоны.
💡 Как избавиться от WebSockets и сэкономить $1 млн в год: неожиданные решения для оптимизации

Как снизить расходы на инфраструктуру и повысить эффективность? Оказывается, отказ от WebSockets может сэкономить миллионы. Вместо привычного подхода можно использовать решения, которые не только проще, но и лучше подходят для определённых задач, как, например, асинхронные очереди или SSE.

Знаете ли вы, как выбрать стратегию, которая одновременно сократит затраты и улучшит масштабируемость? Разберитесь в тонкостях оптимизации и найдите способ выжать максимум из вашей системы. 🚀

🔗 Читать статью
🔗 Зеркало
В последней версии Visual Studio 2022 разработчики получили возможность легко копировать и вставлять файлы и папки между разными экземплярами среды разработки. Ранее этот процесс был сложным и требовал дополнительных манипуляций с файловой системой, что отнимало время и могло приводить к ошибкам.

Теперь всё стало проще: достаточно выбрать нужный файл или папку в «Проводнике решений» (Solution Explorer), нажать Ctrl+C для копирования или Ctrl+X для вырезания, а затем переключиться в другой экземпляр Visual Studio и нажать Ctrl+V для вставки. Все изменения автоматически синхронизируются с файловой системой, что исключает необходимость дополнительных действий.

Также поддерживается перетаскивание (drag and drop) файлов и папок, что делает управление проектами ещё более удобным. Эта функция теперь доступна для всех типов проектов.
Хочешь проверить себя и узнать, насколько ты прокачан в разработке? Тест для айтишников, чтобы проверить знания. Отличный способ отвлечься и сравнить результаты с друзьями!

👉 Пройти
💡 Разработка Web API в .NET Core

Если вы хотите создать свой первый Web API или освежить знания, рекомендуем статью, где шаг за шагом разбирается процесс разработки с использованием .NET Core.

📌 Что вы узнаете:
* Как создать проект Web API с нуля.
* Реализация методов HTTP: GET, POST, PUT, DELETE.
* Настройка маршрутов с помощью атрибутов.
* Подключение к базе данных и выполнение CRUD-операций.
* Основы безопасности: аутентификация и авторизация.
* Логирование и обработка ошибок через Middleware.

Плюс примеры вызова API с использованием C# и советы по версионированию. Отличный материал как для новичков, так и для тех, кто хочет структурировать свои знания.

🔗 Читать статью
💡 Generics в C#: мощный инструмент для универсального программирования

Дженерики — это способ создания универсальных классов, методов и интерфейсов, которые могут работать с любым типом данных, сохраняя безопасность типов и производительность.

📌 Почему дженерики важны?

* Безопасность типов: ошибки компиляции вместо ошибок времени выполнения.
* Повторное использование кода: пишем логику один раз, используем с разными типами.
* Производительность: исключают необходимость упаковки/распаковки (boxing/unboxing).

📚 Пример: универсальный метод для возврата максимального значения

public static T Max(T a, T b) where T : IComparable
{
return a.CompareTo(b) > 0 ? a : b;
}

// Использование:
Console.WriteLine(Max(10, 20)); // Вывод: 20
Console.WriteLine(Max(«apple», «banana»)); // Вывод: banana


🎯 Где применять?

Коллекции: List, Dictionary.
Универсальные методы: сортировка, фильтрация, работа с данными.
Кастомные классы: например, стек или очередь.

Дженерики — это про удобство и производительность. Разработчик пишет меньше кода, а приложения работают быстрее. 🚀