Алгоритм поиска в глубину (DFS) является одним из фундаментальных методов обхода графов. Он используется для решения множества задач, таких как поиск пути, обнаружение циклов и топологическая сортировка.
DFS (Depth-First Search) — это алгоритм обхода графа, который начинает с начальной вершины и исследует как можно глубже вдоль каждого ветви, прежде чем возвращаться назад.
Алгоритм использует стек для отслеживания посещенных вершин. В рекурсивной реализации стек заменяется стеком вызовов функции.
Основные Шаги DFS
Реализация DFS в C#:
class Graph {
    private int V;
    private List<int>[] adj;
    public Graph(int v) {
        V = v;
        adj = new List<int>[v];
        for (int i = 0; i < v; i++) 
            adj[i] = new List<int>();
    }
    public void AddEdge(int v, int w) {
        adj[v].Add(w);
    }
    public void DFS(int start) {
        bool[] visited = new bool[V];
        DFSUtil(start, visited);
    }
    private void DFSUtil(int v, bool[] visited) {
        visited[v] = true;
        Console.Write(v + " ");
        foreach (int n in adj[v]) {
            if (!visited[n])
                DFSUtil(n, visited);
        }
    }
}Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍14👾3❤2🥱1
  Попробуйте повторить пранк из видео. Создайте отдельный класс, который дублирует имя всеми используемого системного класса и внедрите его в стандартный namespace.
Вы можете заложить внутрь неожиданную логику, а коллеги будут ждать совершенно другого результата.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🥱9😢4👏3😁2👾1
  ❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
  
  Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
  
  Вакансии в медиа «Библиотека программиста»
  Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
👏2👍1🔥1👾1
  🌳 LSM-дерево в C#
LSM-дерево (Log-Structured Merge Tree) – одна из самых мощных структур для баз данных, кэширования и key-value хранилищ.
В отличие от B-деревьев, которые часто используются в реляционных БД, LSM-дерево отлично справляется с высоконагруженными системами благодаря журналированию и периодической компактификации данных.
Как работает LSM-дерево
1️⃣  Запись идёт в память (MemTable) – все операции сначала попадают в быстрое RAM-хранилище.
2️⃣  Данные записываются в WAL (Write-Ahead Log) – чтобы не потерять их при сбое.
3️⃣  Сброс в SSTables (Sorted String Tables) – периодически MemTable записывается на диск.
4️⃣  Компактификация – старые файлы объединяются, а удалённые ключи стираются.
Пример реализации в C#:
➖ Где используется
• NoSQL базы данных: LevelDB, RocksDB, Cassandra
• Поисковые системы: Elasticsearch, Apache Lucene
• Хранилища для логов и кэшей
➖  Преимущества LSM-дерева
• Быстрая запись – все изменения сначала пишутся в память
• Эффективное хранение – используется сжатие и компактификация
• Масштабируемость – отлично работает при больших объёмах данных
➖  Но есть нюансы
• Медленный поиск — требуется слияние уровней
• Утилизация ресурсов — периодическая компактификация требует CPU
🔗 Как вы храните данные в своих проектах? Делитесь в комментариях! ⬇️
🐸 Библиотека шарписта
LSM-дерево (Log-Structured Merge Tree) – одна из самых мощных структур для баз данных, кэширования и key-value хранилищ.
В отличие от B-деревьев, которые часто используются в реляционных БД, LSM-дерево отлично справляется с высоконагруженными системами благодаря журналированию и периодической компактификации данных.
Как работает LSM-дерево
Пример реализации в C#:
class LSMTree
{
private SortedDictionary<string, string> memTable = new();
private const string WAL_FILE = "wal.log";
public LSMTree()
{
LoadFromWAL();
}
public void Put(string key, string value)
{
memTable[key] = value;
File.AppendAllText(WAL_FILE, $"{key}:{value}\n");
}
public string Get(string key)
{
return memTable.TryGetValue(key, out var value) ? value : "Not found";
}
private void LoadFromWAL()
{
if (File.Exists(WAL_FILE))
{
foreach (var line in File.ReadAllLines(WAL_FILE))
{
var parts = line.Split(':');
if (parts.Length == 2)
memTable[parts[0]] = parts[1];
}
}
}
}
• NoSQL базы данных: LevelDB, RocksDB, Cassandra
• Поисковые системы: Elasticsearch, Apache Lucene
• Хранилища для логов и кэшей
• Быстрая запись – все изменения сначала пишутся в память
• Эффективное хранение – используется сжатие и компактификация
• Масштабируемость – отлично работает при больших объёмах данных
• Медленный поиск — требуется слияние уровней
• Утилизация ресурсов — периодическая компактификация требует CPU
🔗 Как вы храните данные в своих проектах? Делитесь в комментариях! ⬇️
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍6❤1
  🚨 Ошибка GroupBy в Entity Framework 9
Ошибка возникает, когда после GroupBy выполняется сортировка: OrderBy, ThenBy и другие. В EF9 обработка таких запросов изменилась, из-за чего неожиданно ломаются стандартные сценарии группировки.
Пример проблемного кода:
Такой код работал в предыдущих версиях EF, но теперь выбрасывает исключение.
➖  Как исправить
Можно принудительно выполнить запрос перед сортировкой, чтобы GroupBy обрабатывался в памяти:
Ошибка, вероятнее всего, будет исправлена в Entity Framework 10.
➡️  Суть проблемы в оригинале
🐸 Библиотека шарписта
Ошибка возникает, когда после GroupBy выполняется сортировка: OrderBy, ThenBy и другие. В EF9 обработка таких запросов изменилась, из-за чего неожиданно ломаются стандартные сценарии группировки.
Пример проблемного кода:
var result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.OrderBy(g => g.Key)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList();
Такой код работал в предыдущих версиях EF, но теперь выбрасывает исключение.
Можно принудительно выполнить запрос перед сортировкой, чтобы GroupBy обрабатывался в памяти:
var result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList() // Выполняем в памяти
.OrderBy(g => g.CustomerId) // Теперь сортируем
.ToList();
Ошибка, вероятнее всего, будет исправлена в Entity Framework 10.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🌚21👍5⚡2🔥2
  👨💻 Microsoft анонсировала Chroma DB C# SDK
Теперь разработчики на C# и .NET могут легко интегрировать Chroma DB в свои AI-приложения — Microsoft анонсировала официальный SDK для работы с векторными базами данных.
➖  Что такое Chroma DB
Chroma — это векторная база данных, предназначенная для поиска по эмбеддингам.
Она используется в приложениях с искусственным интеллектом, аналитикой данных и RAG-моделями (Retrieval Augmented Generation).
➖  Как это использовать в C#
1. Добавляем Chroma в проект:
2. Подключаем Chroma в C#-коде:
3. Создаём коллекцию и добавляем данные:
Chroma DB C# SDK — ещё один шаг к тому, чтобы .NET-разработчики легко создавали мощные AI-приложения.
➡️  Подробнее в блоге разработчиков
🐸 Библиотека шарписта
Теперь разработчики на C# и .NET могут легко интегрировать Chroma DB в свои AI-приложения — Microsoft анонсировала официальный SDK для работы с векторными базами данных.
Chroma — это векторная база данных, предназначенная для поиска по эмбеддингам.
Она используется в приложениях с искусственным интеллектом, аналитикой данных и RAG-моделями (Retrieval Augmented Generation).
1. Добавляем Chroma в проект:
dotnet add package ChromaDB.Client
2. Подключаем Chroma в C#-коде:
using ChromaDB.Client;
var configOptions = new ChromaConfigurationOptions(uri: "https://localhost:8000/api/v1/");
using var httpClient = new HttpClient();
var client = new ChromaClient(configOptions, httpClient);
3. Создаём коллекцию и добавляем данные:
var collection = await client.GetOrCreateCollection("movies");
var collectionClient = new ChromaCollectionClient(collection, configOptions, httpClient);Chroma DB C# SDK — ещё один шаг к тому, чтобы .NET-разработчики легко создавали мощные AI-приложения.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍13❤5👾5
  🐳🔍 Как найти утечки памяти в контейнере  с .NET
Инструмент dotMemory от JetBrains помогает диагностировать и анализировать потребление памяти в .NET-приложениях, даже если они работают в контейнерах.
Как использовать dotMemory
1️⃣  Запускаем приложение в контейнере
2️⃣  Подключаемся через dotMemory
dotMemory позволяет собирать дампы памяти прямо из работающего контейнера. Например, с помощью dotMemory CLT:
3️⃣  Ищем утечки
Используем dotMemory, чтобы определить:
• Удерживаемые объекты .
• Долгоживущие объекты, которые не очищаются сборщиком мусора.
• Утечки, связанные с событиями и подписками.
💬 Боролись с утечками памяти в контейнерах? Какие инструменты использовали? Делитесь в комментариях ⬇️
➡️  Подробности в статье
🐸 Библиотека шарписта
Инструмент dotMemory от JetBrains помогает диагностировать и анализировать потребление памяти в .NET-приложениях, даже если они работают в контейнерах.
Как использовать dotMemory
dotMemory позволяет собирать дампы памяти прямо из работающего контейнера. Например, с помощью dotMemory CLT:
dotmemory start --save-to=memory_dump.dmp
Используем dotMemory, чтобы определить:
• Удерживаемые объекты .
• Долгоживущие объекты, которые не очищаются сборщиком мусора.
• Утечки, связанные с событиями и подписками.
💬 Боролись с утечками памяти в контейнерах? Какие инструменты использовали? Делитесь в комментариях ⬇️
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍17🌚2👾2❤1
  🌐 Avalonia UI — универсальный UI-фреймворк
Avalonia UI — это открытый фреймворк для создания настольных, мобильных и встраиваемых (IoT) приложений.
Он поддерживает Windows, macOS, Linux, iOS, Android и даже WebAssembly.
Почему Avalonia UI
➖  Совместимость с XAML – привычный синтаксис WPF, но с дополнительными возможностями, которые делают разработку удобнее.
➖  Native AOT — компиляция в нативный код делает приложения лёгкими, быстрыми и не требующими .NET Runtime.
➖  Малый размер приложений — без тяжёлых зависимостей, в отличие от Electron.
➖  Открытый исходный код — сообщество активно развивает фреймворк, исправляет ошибки и добавляет новые функции без привязки к корпорациям.
➖  Гибкость в разработке — легко интегрируется с различными архитектурными паттернами (MVVM, ReactiveUI) и сторонними библиотеками.
➖  Простота в развертывании — поддержка автономных исполняемых файлов, публикация без сложных зависимостей.
➖  Современные технологии — обновляется, развивается и адаптируется под нужды разработчиков, предлагая передовые решения для UI в .NET.
➡️  Документация по фреймворку
🐸 Библиотека шарписта
Avalonia UI — это открытый фреймворк для создания настольных, мобильных и встраиваемых (IoT) приложений.
Он поддерживает Windows, macOS, Linux, iOS, Android и даже WebAssembly.
Почему Avalonia UI
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍26❤3👾3
  Saga — это паттерн управления распределёнными транзакциями, который помогает сохранить целостность данных без монолитных блокировок и традиционных ACID-ограничений.
Вместо единой транзакции мы разбиваем процесс на последовательность локальных операций, каждая из которых выполняется в отдельном сервисе.
Два подхода к реализации
• Управляется централизованным координатором.
• Каждый шаг транзакции выполняется только после получения команды от оркестратора.
• Минус: если оркестратор падает, всё останавливается.
• Плюс: понятный контроль за процессом, легче отлаживать.
• Нет центрального контроллера, сервисы реагируют на события друг друга.
• Нет узкого места в виде оркестратора.
• Минус: сложнее управлять, можно запутаться в каскаде событий.
•Плюс: масштабируемость, нет единой точки отказа.
Оркестрация проще в управлении, но менее гибкая. Хореография масштабируется лучше, но сложнее в отладке.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍17🔥3👾2❤1
  🍋 Запоздалый #самыйсок за январь
Собрали для вас самые интересные статьи за прошедший месяц!
👨💻 ⭐️  Roadmap для ваших начинаний и продолжений
🤨  Неочевидная проблема FirstOrDefault
⚙️ Мини-гайд по реализации MFA в .NET
⚡️  DeepSeek + .NET
⚙️  Wolverine вместо MediatR
✌️🤖 Как обмануть робота: 9 инструментов для прохождения системы автоматической фильтрации резюме
🐸 Библиотека шарписта
Собрали для вас самые интересные статьи за прошедший месяц!
⚙️ Мини-гайд по реализации MFA в .NET
✌️🤖 Как обмануть робота: 9 инструментов для прохождения системы автоматической фильтрации резюме
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍4❤1👾1
  🛡 Поздравляем героев C#-программирования:
▪️ LINQ — спецназовец по зачистке коллекций. Девиз: «Зачем писать 20 строк, когда можно всё сделать в одну нечитаемую?»
▪️ async/await — командир отряда асинхронных операций. Спас целое поколение программистов от callback-ада.
▪️ garbage collector — главный санитар полка. Прибирается за всеми, но всегда в самый неподходящий момент.
Под чьей защитой ваш код выживает в продакшене? Докладывайте в комментариях 👇
▪️ LINQ — спецназовец по зачистке коллекций. Девиз: «Зачем писать 20 строк, когда можно всё сделать в одну нечитаемую?»
▪️ async/await — командир отряда асинхронных операций. Спас целое поколение программистов от callback-ада.
▪️ garbage collector — главный санитар полка. Прибирается за всеми, но всегда в самый неподходящий момент.
Под чьей защитой ваш код выживает в продакшене? Докладывайте в комментариях 👇
❤22🔥11😁6🌚6
  Forwarded from Библиотека C/C++ разработчика | cpp, boost, qt
  
Документация PostgreSQL — лучший источник знаний о СУБД. Но она отличается огромным объемом: не каждый разработчик осилит 3024 страницы формата А4. 
Опытный бэкендер составил список самых важных сведений, которые ему самому хотелось бы знать перед началом работы с PostgreSQL. Эта подборка сэкономит вам несколько недель изучения документации, и скорее всего, пригодится для работы с другими СУБД.
👉 Список самого важного
Опытный бэкендер составил список самых важных сведений, которые ему самому хотелось бы знать перед началом работы с PostgreSQL. Эта подборка сэкономит вам несколько недель изучения документации, и скорее всего, пригодится для работы с другими СУБД.
👉 Список самого важного
👍10🌚1
  Проверьте свои знания, ответив на 8 вопросов – https://proglib.io/w/08af6203
🧐 Кому подойдет?
Разработчикам, которые знают любой объектно-ориентированный язык программирования и хотят углубиться в архитектурные паттерны.
🎮 Как проходит обучение?
В течение всего интенсива вы будете создавать игру «Звездные войны» и применять ключевые архитектурные паттерны. В процессе изучите:
– Как строить гибкую архитектуру, которая не замедляет разработку
– Как применять IoC-контейнеры и писать модульные тесты
– Как использовать SOLID за пределами ООП
– Как внедрять CI/CD и снижать технический долг
👉 Подробная программа обучения
А по промокоду
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👾1
  🚃 Фоновые задачи с Quartz.NET
Quartz — это открытая библиотека для планирования задач в .NET приложениях. Она позволяет разработчикам выполнять фоновые задачи в определенное время или с заданными интервалами.
Благодаря кластеризации, Quartz может выполнять задачи на нескольких серверах, что особенно важно для систем с высокой нагрузкой. Кроме того, он поддерживает хранение задач в базе данных.
Вот так выглядит регистрация задачи с запуском каждые 10 секунд:
Пример cron-выражения — каждый день в 3 утра:
➡️  Подробности на сайте инструмента
🐸 Библиотека шарписта
Quartz — это открытая библиотека для планирования задач в .NET приложениях. Она позволяет разработчикам выполнять фоновые задачи в определенное время или с заданными интервалами.
Благодаря кластеризации, Quartz может выполнять задачи на нескольких серверах, что особенно важно для систем с высокой нагрузкой. Кроме того, он поддерживает хранение задач в базе данных.
Вот так выглядит регистрация задачи с запуском каждые 10 секунд:
var jobKey = new JobKey("MyBackgroundJob");
builder.Services.AddQuartz(q =>
{
    q.AddJob<MyBackgroundJob>(opts => opts.WithIdentity(jobKey));
    q.AddTrigger(opts => opts
        .ForJob(jobKey)
        .WithIdentity("MyBackgroundJob-trigger")
        .WithSimpleSchedule(schedule => schedule
            .WithIntervalInSeconds(10)
            .RepeatForever()));
});Пример cron-выражения — каждый день в 3 утра:
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("DailyTrigger")
.WithCronSchedule("0 0 3 * * ?"));
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍22👾2
  🎙Месяц на тесты
В обновлении .NET MAUI Community Toolkit от 17 января появилось офлайн-распознавание речи – теперь можно преобразовывать голос в текст без интернета на Android 33+ и iOS 13+.
Также разработчики исправили работу StatusBar на iOS, улучшили CameraView, MediaElement и Maps.
💭  Если вы уже тестировали новые фичи, как впечатления? Делитесь в комментариях👇
🖇 Почитать про релиз
🐸 Библиотека шарписта
В обновлении .NET MAUI Community Toolkit от 17 января появилось офлайн-распознавание речи – теперь можно преобразовывать голос в текст без интернета на Android 33+ и iOS 13+.
Также разработчики исправили работу StatusBar на iOS, улучшили CameraView, MediaElement и Maps.
🖇 Почитать про релиз
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8
  🌳 Бинарное дерево поиска (BST)
BST — это бинарное дерево, где:
• Значение в левой ветви меньше значения в узле.
• Значение в правой ветви больше значения в узле.
Такое свойство обеспечивает эффективный поиск, вставку и удаление — в среднем за O(log n).
Пример реализации:
Как это работает?
1️⃣  Вставка:
• Если значение меньше текущего узла, идём в левое поддерево.
• Если больше — в правое.
• Если узел пуст, создаём новый.
2️⃣  Поиск:
• Сравниваем искомое значение с текущим.
• Меньше — идём влево, больше — вправо, равное — нашли.
3️⃣  Обход:
• In-order обход (LNR) обходит узлы в отсортированном порядке.
💬 А вы уже реализовали BST? Делитесь опытом и вопросами в комментариях!
🐸 Библиотека шарписта
BST — это бинарное дерево, где:
• Значение в левой ветви меньше значения в узле.
• Значение в правой ветви больше значения в узле.
Такое свойство обеспечивает эффективный поиск, вставку и удаление — в среднем за O(log n).
Пример реализации:
class Node
{
public int Value;
public Node Left;
public Node Right;
public Node(int value)
{
Value = value;
Left = Right = null;
}
// Вставка нового значения в дерево
public void Insert(int value)
{
if (value < Value)
{
if (Left == null)
Left = new Node(value);
else
Left.Insert(value);
}
else if (value > Value)
{
if (Right == null)
Right = new Node(value);
else
Right.Insert(value);
}
}
// Поиск значения в дереве
public Node Search(int value)
{
if (value == Value)
return this;
if (value < Value && Left != null)
return Left.Search(value);
if (value > Value && Right != null)
return Right.Search(value);
return null;
}
// Обход дерева в порядке (LNR - InOrder)
public void InOrderTraversal()
{
if (Left != null)
Left.InOrderTraversal();
Console.Write(Value + " ");
if (Right != null)
Right.InOrderTraversal();
}
}
Как это работает?
• Если значение меньше текущего узла, идём в левое поддерево.
• Если больше — в правое.
• Если узел пуст, создаём новый.
• Сравниваем искомое значение с текущим.
• Меньше — идём влево, больше — вправо, равное — нашли.
• In-order обход (LNR) обходит узлы в отсортированном порядке.
💬 А вы уже реализовали BST? Делитесь опытом и вопросами в комментариях!
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5👏2❤1🔥1
  🛠 Используем IOptions с record
В .NET 9 теперь можно использовать record-тип вместо классов для
В отличие от классов, record в
Теперь можно определять конфигурационные записи, загружать их из appsettings.json и внедрять в сервисы через
➡️  Подробности и примеры
🐸 Библиотека шарписта
В .NET 9 теперь можно использовать record-тип вместо классов для
IOptions<T>.В отличие от классов, record в
IOptions<T> в .NET сравнивается по значению.  Он неизменяем, что защищает настройки от случайных изменений, а его лаконичный синтаксис делает код более чистым и поддерживаемым.Теперь можно определять конфигурационные записи, загружать их из appsettings.json и внедрять в сервисы через
IOptions<T>. Кроме того, IOptionsSnapshot<T> и IOptionsMonitor<T> позволяют динамически обновлять настройки без перезапуска приложения.Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍15😢1
  📸 Создание сканера штрих-кодов в .NET MAUI для Windows Desktop
Мы нашли проект, в котором создано кроссплатформенное приложение для Windows, позволяющее считывать коды прямо с камеры, без необходимости в дополнительных устройствах.
➖  Что потребовалось для разработки
✅  .NET MAUI — кроссплатформенный фреймворк для разработки UI-приложений.
✅ Dynamsoft Barcode Reader — SDK для распознавания штрих-кодов.
✅ Windows Media API — работа с камерой и захват изображений.
✅ SkiaSharp — библиотека для графического отображения результатов.
➖  Как работает
1. Получение изображения с камеры с помощью Windows Media API.
2.Обработка кадра и передача его в Dynamsoft Barcode Reader.
3. Распознавание штрих-кода и отображение результата.
4. Вывод данных с графическим выделением кода через SkiaSharp.
➡️  Посмотреть реализацию
🐸 Библиотека шарписта
Мы нашли проект, в котором создано кроссплатформенное приложение для Windows, позволяющее считывать коды прямо с камеры, без необходимости в дополнительных устройствах.
1. Получение изображения с камеры с помощью Windows Media API.
2.Обработка кадра и передача его в Dynamsoft Barcode Reader.
3. Распознавание штрих-кода и отображение результата.
4. Вывод данных с графическим выделением кода через SkiaSharp.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍12😁3
  🚀 Когда стоит отказаться от DI через конструктор
Внедрение зависимостей через конструктор — стандартная практика, но не всегда лучшая. Разберём, когда не стоит её использовать.
🔹 Singleton со Scoped/Transient зависимостями — может вызвать утечки памяти. Решение: фабрики или внедрение через методы.
🔹 Слишком длинные конструкторы — усложняют поддержку. Решение: рефакторинг или внедрение через свойства.
🔹 Динамические зависимости — на этапе компиляции неизвестны. Решение: сервис-локаторы или фабрики.
💡 DI через конструктор хорош, но не универсален. Выбирайте подход в зависимости от контекста
➡️  Подробнее про решение проблем
🐸 Библиотека шарписта
Внедрение зависимостей через конструктор — стандартная практика, но не всегда лучшая. Разберём, когда не стоит её использовать.
🔹 Singleton со Scoped/Transient зависимостями — может вызвать утечки памяти. Решение: фабрики или внедрение через методы.
🔹 Слишком длинные конструкторы — усложняют поддержку. Решение: рефакторинг или внедрение через свойства.
🔹 Динамические зависимости — на этапе компиляции неизвестны. Решение: сервис-локаторы или фабрики.
💡 DI через конструктор хорош, но не универсален. Выбирайте подход в зависимости от контекста
Please open Telegram to view this post
    VIEW IN TELEGRAM
  😁12👍5🤔2
  Совет на 2025-й — будьте осторожнее с выбором работы. 
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
🥱8👍1😁1