Когда логика начинает зависеть от конкретных классов, проект постепенно «деревенеет»: любое изменение тянет за собой цепочку правок, и система теряет гибкость для роста.
В этом гайде:
• Поймём, как отделить намерение от реализации в поведении кода;
• Увидим, почему подмена частей становится проще и безопаснее;
• Разберём, как интерфейсы помогают тестировать модули без хаоса.
Думая в терминах контрактов — код становится гибче, чище и легче расширяется
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤11🤝10👍7😁1
Измеряем время выполнения кода через Stopwatch — без догадок
Иногда кажется, что «этот метод тормозит», но без цифр это только ощущение. В .NET есть готовый инструмент для честного замера времени — класс
Сначала подключим нужное пространство имён — оно лежит в
Теперь померяем, сколько времени занимает простой цикл с подсчётом суммы.
Создаём
Возможный вывод в консоли может выглядеть так:
🔥 Главное — не гадать «быстро или медленно», а мерить цифрами через
➡️ C# Ready | #практика
Иногда кажется, что «этот метод тормозит», но без цифр это только ощущение. В .NET есть готовый инструмент для честного замера времени — класс
Stopwatch.Сначала подключим нужное пространство имён — оно лежит в
System.Diagnostics:using System;
using System.Diagnostics;
Теперь померяем, сколько времени занимает простой цикл с подсчётом суммы.
Создаём
Stopwatch, запускаем, выполняем код, останавливаем и выводим результат:var stopwatch = Stopwatch.StartNew(); // запускаем таймер
long sum = 0;
for (int i = 0; i < 10_000_000; i++)
{
sum += i;
}
stopwatch.Stop(); // останавливаем таймер
Console.WriteLine($"Сумма: {sum}");
Console.WriteLine($"Время выполнения: {stopwatch.ElapsedMilliseconds} мс");
Возможный вывод в консоли может выглядеть так:
Сумма: 49999995000000
Время выполнения: 35 мс
Stopwatch удобно использовать как «обёртку» вокруг любого участка кода: до него — StartNew(), после — Stop() и чтение ElapsedMilliseconds или Elapsed.Stopwatch и уже по ним решать: оптимизировать участок, менять алгоритм или оставить как есть.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍10🔥6
Берём путь к папке и превращаем его в наглядное дерево: с отступами, «ветками» и файлами внутри. Вывод мгновенно показывает структуру проекта или директории — без проводника и лишних кликов.
В этой задаче:
• Рекурсивно обойдёшь подкаталоги и соберёшь структуру папок и файлов;
• Научишься рисовать ветки ├──, └── и вертикальные линии;
• Выведешь аккуратное дерево в консоль, получив свой мини-tree.
Такой вывод удобно использовать, чтобы быстро просматривать структуру репозитория, делиться скриншотами дерева и встраивать результат в свои CLI-инструменты или скрипты сборки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥12❤8🤝5
Как не городить try/catch вокруг каждого вызова?
В бизнес-логике часто у каждой операции свой
С фильтрами в
🔥 Условие
➡️ C# Ready | #совет
В бизнес-логике часто у каждой операции свой
try/catch: обрабатываем заказ, отправляем письмо, пишем в лог — и везде одинаковый catch с логированием и сообщением пользователю:
try { ProcessOrder(orderId); }
catch (Exception ex) { Log(ex); ShowError("Что-то пошло не так"); }
try { SendEmail(orderId); }
catch (Exception ex) { Log(ex); ShowError("Что-то пошло не так"); }
С фильтрами в
catch обработку ошибок можно вынести в одно место. В try остаётся чистый, линейный код, а любой выброшенный Exception попадает в один catch. when (LogError(ex)) сначала логирует ошибку, затем возвращает true, поэтому блок обработки выполнится только после успешного логирования.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤9🔥6
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍15❤12🤝7😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь понятно объясняют вещи, которые обычно подают слишком сложно: шейдеры, освещение, шумы, работа рендера. Все уроки идут с визуализациями и примерами, поэтому даже сложная тема воспринимается легко.
Если интересен геймдев или хочешь лучше понимать, как работает графика в играх — сохраняй.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤8🔥6
Мини-кеш в памяти через MemoryCache — меньше лишних запросов к БД!
Когда данные меняются редко, но читаются постоянно (настройки, справочники, профили), тянуть их каждый раз из БД или файла — расточительно. Проще один раз загрузить и держать в памяти пару минут, используя
Сначала подключим нужные пространства имён и создадим кеш:
Теперь сделаем метод, который сначала пытается взять данные из кеша, а если их там нет — читает из «БД» и кладёт в кеш на 5 минут:
Для примера сделаем простую «заглушку» под запрос к БД:
Теперь посмотрим, как это работает при двух подряд вызовах с одним и тем же
Возможный вывод в консоли:
🔥 Обрати внимание: сообщение «Читаем из БД…» появилось только один раз — дальше значение берётся из памяти, пока не истечёт время жизни записи (в нашем примере 5 минут).
➡️ C# Ready | #практика
Когда данные меняются редко, но читаются постоянно (настройки, справочники, профили), тянуть их каждый раз из БД или файла — расточительно. Проще один раз загрузить и держать в памяти пару минут, используя
MemoryCache.Сначала подключим нужные пространства имён и создадим кеш:
using System;
using Microsoft.Extensions.Caching.Memory;
var cache = new MemoryCache(new MemoryCacheOptions());
Теперь сделаем метод, который сначала пытается взять данные из кеша, а если их там нет — читает из «БД» и кладёт в кеш на 5 минут:
string GetUserName(int userId)
{
string cacheKey = $"user:{userId}";
if (!cache.TryGetValue(cacheKey, out string name))
{
Console.WriteLine("Читаем из БД...");
name = LoadUserNameFromDatabase(userId);
// кэшируем на 5 минут
cache.Set(cacheKey, name, TimeSpan.FromMinutes(5));
}
return name;
}
Для примера сделаем простую «заглушку» под запрос к БД:
string LoadUserNameFromDatabase(int userId)
{
// здесь могла бы быть реальная работа serId}";
}
Теперь посмотрим, как это работает при двух подряд вызовах с одним и тем же
userId:Console.WriteLine(GetUserName(42)); // первый вызов — попадём в "БД"
Console.WriteLine(GetUserName(42)); // второй вызов — уже из кеша
Возможный вывод в консоли:
Читаем из БД...
User #42
User #42
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤10🔥6
Как избавиться от конкатенации строк в логах?
В старом коде логи часто собирают через
Такой код шумный, легко промахнуться с пробелами/запятыми, а параметры потом сложнее вытаскивать из логов.
С интерполяцией и шаблонами сообщения становятся короче и понятнее:
Текст читается как обычное предложение, а значения подставляются отдельными аргументами. Логгер может сохранить их структурированно — по полям
🔥 В итоге логи меньше засоряют код, сообщения читаются с первого взгляда, а параметры удобно анализировать в системе логирования.
➡️ C# Ready | #совет
В старом коде логи часто собирают через
+: дописываем кусочки текста, ID пользователя, источник, детали ошибки — и в итоге получаем длинную, плохо читаемую строку._logger.LogWarning(
"User " + userId + " not found in " + source);
Такой код шумный, легко промахнуться с пробелами/запятыми, а параметры потом сложнее вытаскивать из логов.
С интерполяцией и шаблонами сообщения становятся короче и понятнее:
_logger.LogWarning("User {UserId} not found in {Source}", userId, source);Текст читается как обычное предложение, а значения подставляются отдельными аргументами. Логгер может сохранить их структурированно — по полям
UserId, Source, что упрощает фильтрацию и поиск. Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤9🔥6
Берём одно число в байтах и превращаем его в удобный формат: 1,15 ГБ, 756,4 МБ или 512 Б. Сразу видно, сколько это на самом деле — вместо того, чтобы считать нули глазами.
В этой задаче ты:
• Определишь подходящую единицу измерения (Б, КБ, МБ, ГБ, ТБ) по величине числа;
• Реализуешь функцию, которая делит размер на 1024 и аккуратно округляет результат до двух знаков после запятой;
• Соберёшь человекочитаемую строку, которую можно прямо вставлять в логи, отчёты и вывод консольных утилит.
Такое форматирование делает статистику по файлам, загрузкам и хранилищам гораздо понятнее — и тебе, и тем, кто будет читать логи после тебя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤10👍6🤝1