Почему не следует использовать тип Dynamic в .NET


Введение

Если вы такой же энтузиаст, как и я, вы будете радоваться, когда Microsoft выпустит какое-либо обновление языка, новые библиотеки или документацию о том, что это новый модный способ сделать «это».

Microsoft нацеливает эти выпуски на то, чтобы ответить и улучшить наш опыт разработки, поэтому каждая функция является ответом на конкретную проблему в нашем коде. Но со временем новые разработчики могут усомниться в уместности некоторых из этих дополнений и в конечном итоге высказаться за или против них. Итак, устарели ли уже Dynamic и ExpandoObject? Стоит ли их использовать?

Зачем разглагольствовать 🙂

Идея этой статьи родилась из PR, который я недавно проверял, я увидел, что мой коллега использует Dynamic и ExpandoObject… (простите R**** !)

Что такое Dynamic

Вкратце, использование dynamic говорит компилятору пропустить все проверки, такие как синтаксис, и оценить их во время выполнения:

dynamic test=new object();

Этот код будет компилироваться нормально, даже если мы знаем, что объект не содержит функции Bark(). Вместо этого во время выполнения будет выдана ошибка.

Проблема

Как и в случае с ключевым словом Async, когда вы начинаете использовать dynamic, вы не можете остановиться. Ваш динамический код будет разрастаться подобно вирусу и появляться повсюду, устраняя одно из самых недооцененных преимуществ C# — статические типы и проверку во время компиляции…

В некотором смысле, вы начнете писать Python или JS в своем коде на C#. Если вы действительно хотите этого, используйте другой язык с самого начала!

Далее, читабельность: Вы используете объект, который вы не можете отследить в IDE, как вы можете выразить свое намерение в коде, который вы пишете, если даже компилятор не поймет его. Даже C# не понимает, что вы пишете, и будет оценивать это на лету, так что как нам быть 😉

Так как этого было недостаточно, Performance: Фаза сборки и компиляции экономит много времени перед выполнением. Это главное различие между компилируемыми и интерпретируемыми языками…
Каждый из них имеет свои плюсы и минусы, но в облачной среде, когда вы хотите выжать каждый бит производительности из вашего приложения, вы должны учитывать и это.

И последнее, но, конечно же, не менее важное: подумайте о своих путешествиях по поиску ошибок, когда новичок меняет что-либо в объектах или функциях. Действительно ли вы чувствуете себя в безопасности при использовании этой функции?
Даже если у вас есть модульные тесты, разве принятие каждого возможного значения в вашем алгоритме не пугает вас?
А ведь должно!

Исключение

Если это так, то почему Microsoft ввела эту функцию в 2010 году?! Как уже говорилось ранее, каждая функция относится к определенному контексту и решает определенную проблему. Так, в свое время C# был эксклюзивом для Windows. Если вы помните .NET Framework (время летит…), он был прямым конкурентом java и других языков.

С помощью функции динамических типов Microsoft хотела достичь того, что называется COM Interop. Идея заключалась в том, что вы можете интегрировать и запускать различные приложения и платформы внутри C# и .NET. Это было полезно для интеграции с существующими системами и скриптами в вашей кодовой базе.

Практический пример: у вас есть существующее приложение Ruby, и вы начали использовать C# для настольного приложения. Вы можете установить библиотеку под названием IronRuby и загрузить ваш Ruby-код ВНУТРИ C#. Таким образом, если вы создали класс в Ruby, вы можете инстанцировать и использовать его в вашем приложении .NET, что просто безумие!

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

Реальное исключение

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

Как не использовать

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

Поэтому в качестве общего правила и вывода:

  • Попробуйте использовать дженерики, если это не сработает:
  • Пытайтесь использовать объекты и боксирование, если и только если это не работает:
  • Ваше единственное средство — это динамический тип и ExpandoObject 🙂

Но, по крайней мере, вы попытались!

Оцените статью
Procodings.ru
Добавить комментарий