Как стать автором
Обновить
39
0
questor @questor

Пользователь

Отправить сообщение

Делегаты и события в C#

Время на прочтение8 мин
Количество просмотров77K
Перевод статьи подготовлен специально для студентов курса «Разработчик С#».




Что такое события в C#?


Событие может быть использовано для предоставления уведомлений. Вы можете подписаться на событие, если вам нужны эти уведомления. Вы также можете создавать свои собственные события, которые будут уведомлять вас о том, что случилось что-то, что вас интересует. .NET Framework предлагает встроенные типы, которые можно использовать для создания событий. Используя делегаты, лямбда-выражения и анонимные методы, вы можете создавать и использовать события удобным способом.
Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии9

Async/await в C#: концепция, внутреннее устройство, полезные приемы

Время на прочтение24 мин
Количество просмотров231K
Доброго времени суток. В этот раз поговорим на тему, в которой начинал разбираться каждый уважающий себя адепт языка C# — асинхронное программирование с использованием Task или, в простонародье, async/await. Microsoft проделали хорошую работу — ведь для того, чтобы использовать асинхронность в большинстве случаев нужно лишь знание синтаксиса и никаких других подробностей. Но если лезть вглубь, тема довольно объемная и сложная. Ее излагали многие, каждый в своем стиле. Есть очень много классных статей по этой теме, но все равно существует масса заблуждений вокруг нее. Постараемся исправить положение и разжевать материал настолько, насколько это возможно, не жертвуя ни глубиной, ни пониманием.


Читать дальше →
Всего голосов 34: ↑32 и ↓2+30
Комментарии27

Монада «Maybe» через async/await в C# (без Task-oв!)

Время на прочтение14 мин
Количество просмотров15K


Обобщенные асинхронные типы возвращаемых значений — это новая возможность появившаяся в C# 7, которая позволяет использовать не только Task в качестве возвращаемого типа асинхронных (async/await) методов, но также и любые другие типы (классы или структуры), удовлетворяющие определенным требованиям.


В то же время async/await — это способ последовательно вызвать некий набор функций внутри некоторого контекста, что является сущностью шаблона проектирования Монада. Возникает вопрос, можем ли мы использовать async/await для написания кода, который будет вести себя так же, как если бы мы использовали монады? Оказывается, что да (с некоторыми оговорками). Например, приведенный ниже код компилируется и работает:


async Task Main()
{
  foreach (var s in new[] { "1,2", "3,7,1", null, "1" })
  {
      var res = await Sum(s).GetMaybeResult();
      Console.WriteLine(res.IsNothing ? "Nothing" : res.GetValue().ToString());
  }
  // 3, 11, Nothing, Nothing
}

async Maybe<int> Sum(string input)
{
    var args = await Split(input);//Нет проверки результата
    var result = 0;
    foreach (var arg in args)
        result += await Parse(arg);//Нет проверки результата
    return result;
}

Maybe<string[]> Split(string str)
{
  var parts = str?.Split(',').Where(s=>!string.IsNullOrWhiteSpace(s)).ToArray();
  return parts == null || parts.Length < 2 ? Maybe<string[]>.Nothing() : parts;
}

Maybe<int> Parse(string str)
    => int.TryParse(str, out var result) ? result : Maybe<int>.Nothing();

Далее я объясняю, как работает этот код ...

Читать дальше →
Всего голосов 21: ↑20 и ↓1+19
Комментарии31

Многопоточность в .NET: когда не хватает производительности

Время на прочтение26 мин
Количество просмотров46K


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

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

Под катом — видео и расшифровка моего доклада с конференции DotNext, где я разбираю несколько примеров, когда использование средств из стандартной библиотеки .NET (Task.Delay, SemaphoreSlim, ConcurrentDictionary) привело к просадкам производительности, и предлагаю решения, заточенные под конкретные задачи и лишённые этих недостатков.
Всего голосов 49: ↑48 и ↓1+47
Комментарии87

Инструментарий для анализа и отладки .NET приложений

Время на прочтение6 мин
Количество просмотров22K

Заглянуть «под капот» кода или посмотреть на внутреннее устройство CLR можно с помощью множества инструментов. Этот пост родился из твита, и я должен поблагодарить всех, кто помог составить список подходящих инструментов. Если я пропустил какие-то из них, напишите в комментариях.


Во-первых, я должен упомянуть, что хороший отладчик уже присутствует в Visual Studio и VSCode. Также существует множество хороших (коммерческих) профилировщиков .NET и инструментов мониторинга приложений, на которые стоит взглянуть. Например, недавно я попробовал поработать с Codetrack и был впечатлён его возможностями.


Однако оставшийся пост посвящён инструментам для выполнения отдельных задач, которые позволят лучше понять, что происходит. Все инструменты имеют открытый исходный код.


Всего голосов 50: ↑50 и ↓0+50
Комментарии9

«Массаж для твоего мозга»: поговорим об ASMR

Время на прочтение5 мин
Количество просмотров35K
Гиби сидит перед камерой. У нее в руках баночка с витаминами. Вы видите и слышите, как она постукивает по ней подушечками пальцев. Еле заметные звуки от прикосновений сливаются в единый поток. Отложив баночку в сторону, она шепотом заявляет, что собирается сортировать свои витамины, и на протяжении оставшихся тридцати минут видеролика девушка медленно раскладывает таблетки, одну за другой. Она делает это так, словно одно резкое движение или звук нарушит гармонию коробочек, капсул и десятков тысяч прикованных к этому видео зрителей.


Читать дальше →
Всего голосов 21: ↑17 и ↓4+13
Комментарии30

Часто задаваемые вопросы о системах типов

Время на прочтение10 мин
Количество просмотров14K
Автор статьи, перевод которой мы сегодня публикуем, говорит, что источником вдохновения для её написания послужил этот пост и комментарии к нему. По его словам, IT-специалисты имеют неправильные представления о типах, используют некорректную терминологию и, обсуждая вопросы, связанные с типами, приходят к ошибочным выводам. Он отмечает то, что не является защитником статической системы типов. Единственное, что его беспокоит — это правильное использование терминов. Это позволяет вести конструктивные дискуссии. Автор говорит, что написал этот материал спонтанно, но надеется на то, что в нём нет ошибок. Если же он что-то и напутал — он просит дать ему об этом знать.



Давайте раз и навсегда разберёмся во всём том, что вызывает неразбериху при разговорах о системах типов.
Читать дальше →
Всего голосов 49: ↑41 и ↓8+33
Комментарии111

Несколько простых, но полезных советов по работе с геттерами в Vuex

Время на прочтение3 мин
Количество просмотров11K

Vuex предоставляет удобные инструменты для работы с данными, но некоторые разработчики используют их не всегда по назначению, либо создают избыточные конструкции там, где можно было написать более понятно и ёмко, такое также случается, когда разработчик только знакомится с данными инструментами. В данной статье будут приведены некоторые рекомендации по организации геттеров (Getters), которые вы сможете применить в работе.

Читать дальше →
Всего голосов 25: ↑23 и ↓2+21
Комментарии19

Под капотом у React. Пишем свою реализацию с нуля

Время на прочтение8 мин
Количество просмотров30K



В этом цикле статей мы создадим свою реализацию React с нуля. По окончании у вас будет понимание, как работает React, какие методы жизненного цикла компонента он вызывает и для чего. Статья рассчитана на тех, кто уже использовал React и хочет узнать о его устройстве, или на очень любопытных.

image
Читать дальше →
Всего голосов 26: ↑23 и ↓3+20
Комментарии12

Асинхронное программирование – производительность async: понять расходы на async и await

Время на прочтение21 мин
Количество просмотров31K

Это статья достаточно древняя, но не потерявшая актуальности. Когда разговор заходит об async/await, как правило, появляется ссылка на неё. Перевода на русский найти не смог, решил помочь кто не fluent.




Асинхронное программирование долгое время было царством самых опытных разработчиков с тягой к мазохизму – тех, кто имел достаточно свободного времени, склонность и психические способности размышлять об обратных вызовах (callback) из обратных вызовов в нелинейном потоке выполнения. С появлением Microsoft .NET Framework 4.5, C# и Visual Basic принесли асинхронность всем нам, так что простые смертные теперь могут писать асинхронные методы почти так же легко, как синхронные. Обратные вызовы больше не нужны. Больше не нужна явная передача (marshaling) кода из одного контекста синхронизации в другой. Больше не нужно беспокоиться как двигаются результаты выполнения или исключения. Нет необходимости в трюках, которые искажают средства языков программирования для удобства разработки асинхронного кода. Короче говоря, больше нет мороки и головной боли.

Читать дальше →
Всего голосов 24: ↑24 и ↓0+24
Комментарии5

Unit тестирование в Laravel

Время на прочтение7 мин
Количество просмотров43K

Я часто слышу среди обсуждений в сообществе мнение, что unit тестирование в Laravel неправильное, сложное, а сами тесты долгие и не дающие никакой пользы. Из-за этого эти тесты мало кто пишет, ограничиваясь лишь feature тестами, а польза unit тестов стремится к 0.
Я тоже так считал когда-то, но, однажды я задумался и спросил себя — может быть я не умею их готовить?


Некоторое время я разбирался и на выходе у меня сформировалось новое понимание о unit тестах, а тесты стали понятными, дружелюбными, быстрыми и стали мне помогать.
Я хочу поделиться с сообществом своим пониманием, и еще лучше разобраться в этой теме, сделать мои тесты еще лучше.

Читать дальше →
Всего голосов 20: ↑19 и ↓1+18
Комментарии10

Удивительные возможности нейросетей 2019 года

Время на прочтение5 мин
Количество просмотров23K


Кажется, не проходит и дня без того, чтобы в новостях не проскочило сообщение со словами «искусственный интеллект», «нейросеть», «машинное обучение». Это и не удивительно, алгоритмы постоянно совершенствуются, получают новые знания, включая информацию о каждом из нас. И это вырисовывает весьма интересные перспективы будущего, с персонализированными товарами, пищей и развлечениями. Но обо всем по порядку.
Всего голосов 19: ↑15 и ↓4+11
Комментарии16

Шпаргалки по безопасности: JWT

Время на прочтение9 мин
Количество просмотров58K


Многие приложения используют JSON Web Tokens (JWT), чтобы позволить клиенту идентифицировать себя для дальнейшего обмена информацией после аутентификации.

JSON Web Token – это открытый стандарт (RFC 7519), который определяет компактный и автономный способ безопасной передачи информации между сторонами в виде объекта JSON.
Читать дальше →
Всего голосов 21: ↑19 и ↓2+17
Комментарии40

Элегантная обработка ошибок в JavaScript с помощью монады Either

Время на прочтение18 мин
Количество просмотров23K
Давайте немного поговорим о том, как мы обрабатываем ошибки. В JavaScript у нас есть встроенная функция языка для работы с исключениями. Проблемный код мы заключаем в конструкцию try...catch. Это позволяет прописать нормальный путь выполнения в разделе try, а затем разобраться со всеми исключениями в разделе catch. Неплохой вариант. Это позволяет сосредоточиться на текущей задаче, не думая о каждой возможной ошибке. Определённо лучше, чем засорять код бесконечными if.

Без try...catch трудно проверять результаты каждого вызова функции для неожиданных значений. Это полезная конструкция. Но у неё есть определённые проблемы. И это не единственный способ обрабатывать ошибки. В статье мы рассмотрим использование монады Either в качестве альтернативы try...catch.

Прежде чем продолжить, отмечу пару моментов. Статья предполагает, что вы уже знаете о композиции функций и каррировании. И предупреждение. Если вы раньше не сталкивались с монадами, они могут показаться действительно… странными. Работа с такими инструментами требует изменить мышление. Поначалу это бывает тяжело.

Не волнуйтесь, если сразу запутались. У всех так. В конце статьи я перечислил несколько ссылок, которые могут помочь. Не сдавайтесь. Эти штуки опьяняют, как только проникают в мозг.
Читать дальше →
Всего голосов 26: ↑24 и ↓2+22
Комментарии12

5 чрезвычайно простых способов ощутимо повысить скорость вашего VueJS-приложения

Время на прочтение4 мин
Количество просмотров14K
Здравствуйте. Перевод данной статьи подготовлен специально для студентов курса «Разработчик JavaScript», который стартует уже на следующей неделе.


Голос Чуи

Немного обо мне — меня зовут Вайбхав, я из Five2One. Я вовлечен во VueJS уже целых 2 года (с момента выхода 1.0) и в основном помогал создавать/обучать 3 из крупнейших кодовых баз VueJS в Сиднее. Этот код служит миллионам людей, поэтому моя задача — не просто создавать масштабируемые паттерны кода, а еще и в значительной степени заботиться о его производительности.

Видите ли, как правило, небольшие стартапы и базы кода ориентируются на то, чтобы быстро вытолкнуть код в свет и доставить продукт клиенту, в чем мы преуспели — вы можете оценить нашу работу на сайте Five2one.com.au, но помимо этого, в качестве инженеров, наша цель — заботиться о производительности и масштабируемости.

Давайте перейдем прямо к делу — поговорим о некоторых простых способах повышения производительности вашего приложения VueJS.
Читать дальше →
Всего голосов 34: ↑23 и ↓11+12
Комментарии7

Понимание джойнов сломано. Продолжение. Попытка альтернативной визуализации

Время на прочтение2 мин
Количество просмотров82K
Многие из вас читали предыдущую статью про то, как неправильная визуализация для объяснения работы JOIN-ов в некоторых случаях может запутать. Круги Венна не могут полноценно проиллюстрировать некоторые моменты, например, если значения в таблице повторяются.

При подготовке к записи шестого выпуска подкаста "Цинковый прод" (где мы договорились обсудить статью) кажется удалось нащупать один интересный вариант визуализации. Кроме того, в комментариях к изначальной статье тоже предлагали похожий вариант.


Все желающие приглашаются под кат

Читать дальше →
Всего голосов 41: ↑35 и ↓6+29
Комментарии32

Прокачиваем разработку на Vue с помощью паттернов: HOC

Время на прочтение3 мин
Количество просмотров26K

Паттерн HOC (Higher Order Component) очень популярен у React-разработчиков. А вот Vue-разработчики его как-то обходят стороной. Очень зря. Попробуем разобраться в этом.

Всего голосов 21: ↑21 и ↓0+21
Комментарии48

Пишем безопасное браузерное расширение

Время на прочтение25 мин
Количество просмотров19K


В отличие от распространенной "клиент-серверной" архитектуры, для децентрализованных приложений характерно:


  • Отсутствие необходимости хранить базу данных с логинами и паролями пользователя. Информация для доступа хранится исключительно у самих пользователей, а подтверждение их достоверности происходит на уровне протокола.
  • Отсутствие необходимости использовать сервер. Логика приложения может выполняться в блокчейн-сети, где возможно и хранение необходимого количества данных.

Существует 2 относительно безопасных хранилища для ключей пользователей — хардверные кошельки и браузерные расширения. Хардверные кошельки в большинстве своем максимально безопасны, однако сложны в использовании и далеко не бесплатны, а вот браузерные расширения являются идеальным сочетанием безопасности и простоты в использовании, а еще могут быть совершенно бесплатны для конечных пользователей.


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


В статье будет пошаговая инструкция как написать браузерное расширение, с примерами кода и скриншотами. Весь код вы можете найти в репозитории. Каждый коммит логически соответствует разделу данной статьи.

Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии2

Глобальное кеширование результатов Query в ASP.NET CORE

Время на прочтение10 мин
Количество просмотров8.6K

Парадигма CQRS в том или ином виде предполагает, что вызовы Query не будут менять состояние приложения. То есть многократные вызовы одной и той же query, в рамках одного запроса, будут иметь один и тот же результат.


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


public interface IQuery<TIn, TOut>
{
   TOut Query(TIn input);
}

public interface IAsyncQuery<TIn, TOut>: IQuery<TIn, Task<TOut>
{
}
Читать дальше →
Всего голосов 13: ↑13 и ↓0+13
Комментарии11

Быстрорастворимое проектирование

Время на прочтение25 мин
Количество просмотров44K
Люди учатся архитектуре по старым книжкам, которые писались для Java. Книжки хорошие, но дают решение задач того времени инструментами того времени. Время поменялось, C# уже больше похож на лайтовую Scala, чем Java, а новых хороших книжек мало.

В этой статье мы рассмотрим критерии хорошего кода и плохого кода, как и чем измерять. Увидим обзор типовых задач и подходов, разберем плюсы и минусы. В конце будут рекомендации и best practices по проектированию web-приложений.

Эта статья является расшифровкой моего доклада с конференции DotNext 2018 Moscow. Кроме текста, под катом есть видеозапись и ссылка на слайды.


Читать дальше →
Всего голосов 48: ↑47 и ↓1+46
Комментарии34

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность