Получи случайную криптовалюту за регистрацию!

codaza

Логотип телеграм канала @codaza — codaza C
Логотип телеграм канала @codaza — codaza
Адрес канала: @codaza
Категории: Технологии
Язык: Русский
Количество подписчиков: 5.10K
Описание канала:

Канал о разработке на платформе .NET с использованием языка программирования C#. Рассматриваются актуальные подходы и современные методологии разработки.
YouTube:
https://www.youtube.com/c/codaza-channel
Контакты:
codaza.channel@gmail.com

Рейтинги и Отзывы

4.00

2 отзыва

Оценить канал codaza и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

2

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 3

2022-04-15 11:00:37
#codaza_спрашивает

Всем привет!

Сегодня у нас еще один занятный кусочек кода, которому стоит провести code review. Как обычно, всё компилируется и все тесты проходят на ура. Сомнений нет — код рабочий. Но всё же есть ощущение что в production-среду этому методу рановато. В production предстоит работа с большим массивом данных и, возможно, этот метод еще не готов к таким нагрузкам. А может и готов...

Есть идеи?
1.1K viewsedited  08:00
Открыть/Комментировать
2022-04-08 11:00:08
#капитану_на_заметку

Всем привет!

В прошлой рубрике #капитану_на_заметку мы говорили про хороший дизайн для Enum. Сегодня мы затронем вопрос производительности использования Enum.

Получение строкового представления для перечисляемого типа — весьма частая операция. Это может потребоваться при формировании JSON, выводе данных в интерфейс Web или Desktop приложений, логировании в системы сбора логов и т. д. Для решения такой задачи, естественным действием разработчика на C# будет вызов метода ToString().

Если же значение перечисляемого типа известно заранее (на этапе компиляции), хорошей практикой является использование выражения nameof. Значение выражения nameof вычисляется во время компиляции, и это не влияет на время выполнения. В ряде случаев, это может существенно повысить общую производительность вашего приложения. Поэтому, в следующий раз, перед вызовом ToString(), задумайтесь... может лучше nameof?

+1 к производительному коду

Всем хороших выходных!
1.7K views08:00
Открыть/Комментировать
2022-04-02 11:19:41 Всем привет!

Продолжаем разбираться с шаблонами проектирования "банды четырёх (GoF)". Сегодня на повестке: Builder (Строитель). Строитель отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

Внимание Ролик может вызывать сильное чувство аппетита. Перекусите что-нибудь перед просмотром

Приятного просмотра!



2.0K views08:19
Открыть/Комментировать
2022-03-25 11:00:34
#капитану_на_заметку

Всем привет!

Enum — это тип значения, определенный набором именованных констант и т.д. и т.п. далее по тексту из MSDN.

Это понятно. Есть вещи важнее понятных истин. Я говорю про дизайн. Вы знаете про хороший дизайн для Enum в C#?
Если нет, то скорее ловите, чтобы уже с понедельника ваш код стал выглядеть более профессионально.

Когда мы создаём новый Enum, мы всегда должны предоставлять значение по умолчанию (default value). В противном случае, первое значение в созданном Enum может быть рассмотрено как значение по умолчанию. Такое поведение нельзя считать верным и может вести к потенциально опасным и трудно отлаживаемым ошибкам.

Добавьте значение по умолчанию, которое будет адекватно вашему бизнес-домену. Это может быть "None", "Unknown" и прочее. Тем самым вы явно укажете то, как следует обращаться с вашим типом.

+1 к чистому коду

Всем хороших выходных!
2.2K views08:00
Открыть/Комментировать
2022-03-20 15:47:05 Дааа... Кажется, из последнего примера ребята действительно выжали максимум. Это был мастер-класс по code review на высоком уровне Если вы не успели пробежаться по комментариям в предыдущем посте, то сделайте это.

Итак, главную проблему, первым заметил подписчик Алексей. Он увидел, что ожидание выполнения всех задач (Task.WhenAll()) - расточительно. По логике метода необходимо:

1. Обратиться ко всем имеющимся адресам, которые возвращает метод GetReplicationUrls(). Нам предоставляют множество резервных адресов, так как подразумевается, что некоторые могут быть недоступны по самым разным причинам (неисправен, находится на техническом обслуживании и т. д.). Разумеется, какие адреса и в какой момент они будут нам доступны, нам никто не сообщит.
2. Получить цены.
3. Вернуть одну цену.

Исходя из этой логики, ожидание всех цен абсолютно не требуется. Достаточно дождаться первой полученной цены и вернуть её. В этом нам поможет статический метод WhenAny(), который реализован в классе Task. Как только одна из задач будет завершена (цена получена), мы сразу же вернём её результат. В противном случае, мы будем вынуждены ждать столько времени, сколько занимает самая длительная задача, что увеличит время выполнения метода LoadItemPriceAsync(). Это будет особенно критично в тех случаях, когда будут сетевые задержки, таймауты и прочие сценарии, которые нельзя назвать успешными.

Кроме того, Алесей предложил интересный алгоритм в случае одновременного обращения множества задач к одному и тому же адресу. Почитайте в комментариях, это может оказаться полезным.

На этом можно было закончить, но подписчик Alexander Radchenko заметил, что производительность можно поднять еще выше. Александр очень точно написал эту мысль в комментарии, поэтому я приведу цитату:

"Для ещё более быстрого решения надо добавить CancellationToken чтобы останавливать цикл создания задач, как только первая задача выполнена и даже возможно прерывание уже выполняемых задач."

Безусловно, в Enterprise разработке высоконагруженных систем, применить такой подход можно и нужно.

Завершил картину Руслан Петряев, предложив лаконичный вариант рефакторинга, который мне очень понравился:

private async Task LoadItemPriceAsync(int itemId) =>
await Task.WhenAny(GetReplicationServersUrls()
.Select(async url => await LoadCurrentPriceAsync(itemId, url)))
.Result;

Здесь не подразумевается обработка исключений. Это вам на самостоятельную работу Главная суть полностью раскрыта!

Что же... Это была прекрасная командная работа. Всем нам очень повезло поучаствовать в этом полезном образовательном действе.

Спасибо!
2.1K views12:47
Открыть/Комментировать
2022-03-20 15:47:02
#codaza_отвечает
1.3K views12:47
Открыть/Комментировать
2022-03-18 11:08:43
#codaza_спрашивает

Единственная причина для существования времени — чтобы все не случилось одновременно.

Альберт Эйнштейн

Всем привет!

Вчера не code review мне попался этот фрагмент кода. Метод проходит все модульные тесты. Я думаю, этот код сможет работать в production. Но... Кажется, он может тратить меньше времени...

Что думаете?

Любые улучшения только приветствуются
1.4K views08:08
Открыть/Комментировать
2022-03-14 10:02:11
#капитану_на_заметку

Всем привет!

Сегодня понедельник, а значит, нужно сделать еще один шаг к чистому коду. Вы слышали про конструкцию "catch - when" в C#?

Это ещё одна суперспособность на уровне языка, которая делает программирование на C# по-настоящему чем-то особенным. Фишка в том, что мы можем фильтровать одно и то же исключение в блоке catch написав логическое выражение после оператора when. Это позволит ловить исключения одного и того же типа несколько раз, но фильтровать их по разным условиям. Данный подход сделает обработку исключений более структурной и системной. Мне нравится применять этот способ при обработке исключений, где логика обработки выходит за рамки определения типа исключения.

+1 к чистому коду

Всем спокойной недели!
1.5K views07:02
Открыть/Комментировать
2022-03-04 10:00:20
#капитану_на_заметку

Всем привет!

Вы уже знаете про очень полезный атрибут [DebuggerDisplay], который находится в пространстве имён System.Diagnostics? Если нет, то только что ваш дебаггинг вышел на уровень комфорт-класса . С помощью этого атрибута мы можем указать способ отображения экземпляра класса во всплывающем окне дебаггера переменной, которое появляется при наведении курсора мыши.

+1 к премудростям дебага

Поделитесь в комментариях какими полезными плюшками дебага вы пользуетесь и как они помогают решать возникающие проблемы.
1.8K views07:00
Открыть/Комментировать
2022-02-25 10:20:03
#капитану_на_заметку

Всем привет!

Вы когда-нибудь заглядывали в System.Collections.Concurrent? Если вам доводилось писать многопоточный код, скорее всего вы там были неоднократно. Как только мне нужно писать многопоточный код, я на 99% уверен, что найду там структуру данных, которая решит большинство моих технических вопросов. Но есть коллекция, которая была разработана для очень специфических случаев - ConcurrentBag.

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

Не рекомендуется использовать её без предварительного бенчмаркинга (замеров производительности). Если вы на 100% не уверены, что вам нужен именно ConcurrentBag, отдайте предпочтение ConcurrentQueue
1.8K views07:20
Открыть/Комментировать