Считаете ли вы атрибуты C# (или подобные механизмы) хорошей идеей или вы не одобряете их использование?
-
11-09-2019 - |
Вопрос
За последние 4–5 лет я создал множество проектов и фреймворков, использующих атрибуты C#.
Но в последнее время я вижу, как многие люди открыто отказываются от их использования или меняют свои структуры, чтобы уменьшить потребность в них или их использование.
Я нашел их настоящей находкой, но теперь начинаю задаваться вопросом, чего мне не хватает.
Чтобы уточнить:Использование соглашения вместо конфигурации становится основным принципом, которому необходимо следовать, особенно в области ORM.В этой области вы можете сопоставить поля с файлом конфигурации (XML), использовать атрибут или использовать общее соглашение об именах, которое напрямую сопоставляется с полями в таблицах вашей базы данных.У меня нет никаких ссылок на цитаты, но я читал некоторые негативные отзывы о добавлении еще одного Атрибута в смесь.
Но я считаю, что три варианта, которые я только что перечислил, Атрибуты по-прежнему имеют наибольший смысл.Файл конфигурации сложнее поддерживать, и общее соглашение об именах связывает вас с реализацией поля базы данных.Атрибуты размещаются именно там, где они необходимы, и реализация может меняться без отрыва от того места, где она используется.
Решение
На самом деле атрибуты служат двум целям:как вещи, видимые пользователем, и как вещи, создаваемые компилятором.
Я предполагаю, что вы говорите о видимых пользователем атрибутах.
В целом я бы сказал, что видимые пользователю атрибуты не идеальны.
Большую часть времени они используются для внедрения какой-либо формы пользовательского языка поверх C#.Атрибуты DLINQ являются хорошим примером этого.Лучшим подходом, с точки зрения потребителя, было бы добавить первоклассную поддержку к основному языку.В конечном итоге это будет выглядеть гораздо более естественно.(с языковой поддержкой для определения таблиц и внешних ключей было бы гораздо проще работать, чем со всеми этими сумасшедшими атрибутами linq-to-sql).
Однако в действительности расширение языка программирования обходится большинству разработчиков слишком дорого.Выгоды просто не перевешивают затраты.
Возможно, когда-нибудь в C# появятся функции метапрограммирования, которые упростят выполнение подобных задач.
Однако на данный момент такой возможности не существует.
Это оставляет вам 3 варианта:
- Использовать атрибуты
- Используйте динамический язык и генерируйте код во время выполнения.
- Просто не используйте генеративное программирование
Обычно вариант №1 оказывается самым простым выбором, даже если он не идеален.
Другие советы
Это сложный вопрос, на который можно дать общий ответ.Атрибуты — еще одна языковая функция, которая невероятно эффективна при правильном использовании, но может привести к злоупотреблениям.Я никогда не видел веской причины полностью отказаться от использования атрибутов, и на самом деле нет причин думать, что это плохая идея.
На самом деле верно обратное.Атрибуты позволяют добавлять в метаданные информацию, специфичную для платформы.Информация, которую просто невозможно легко выразить через иерархию типов.Это значительно увеличивает возможности фреймворков, использующих атрибуты.
Я, конечно, видел пару реализаций, в которых люди немного злоупотребляли ими, но ничего особенного.Вы можете быть более конкретным?Есть ли конкретные атрибуты/фреймворки, о которых вы говорите?
Это довольно широкий вопрос, например: «Должен ли я положить сыр в запеканку»;Ответ на оба вопроса: «Это зависит от того, что вы делаете».
Если вы активно используете адтрибуты и используете их почти как парадигму декларативного программирования, то вы, вероятно, столкнетесь с проблемами на этом пути.Остается только догадываться, происходит ли это из-за замедления где-то в процессе отражения или просто из-за общей ремонтопригодности.
Это как и все остальное... используйте их, когда это уместно, и сделайте свой код более эффективным и читабельным.Не используйте их ради того, чтобы их использовать, и не отказывайтесь от них ради того, чтобы отказаться от них.
Я считаю их чрезвычайно полезными, когда дело доходит до определения метаданных о моем коде.Я использую их для создания пользовательских отчетов, для архитектуры плагинов и для взаимодействия со сторонним кодом.
Полагаю, можно делать все по соглашению, но они мне нравятся.
Я вижу интенсивное использование атрибутов в ASP.NET MVC.Фактически, переход на MVC позволил мне значительно расширить использование атрибутов.Я не уверен, откуда взялось ваше восприятие негативной реакции против атрибутов, но я определенно не вижу ее в MS, по крайней мере, в отношении MVC.
Мне особенно нравится, как атрибуты можно использовать для обеспечения сквозного поведения (аспектов) для тех контроллеров/действий, которые оформлены таким образом.Видя, как MVC устроен для обработки вызова атрибутов до и после вызова действия, я должен поверить, что это предпочтительный способ заставить аспекты работать в MVC.
Что ж, если использовать ASP.NET MVC, я бы сказал, не беспокойтесь об этом.В этом фреймворке сделано так много с использованием отражения и атрибутов, что я не вижу в этом никаких проблем.MVC — довольно новая среда, и она используется повсюду.От проверки ввода, обработки ошибок до замечательного атрибута ActionFilter — их очень много.Так нет, лично я не вижу в них ничего плохого.
Лично я считаю, что атрибуты, как и большинство особенностей языка, имеют свое место, но ими можно злоупотреблять или злоупотреблять.
В правильных рамках они бесценны.Они определенно упрощают такие вещи, как DI-фреймворки (МЭФ это отличный пример) и очень, очень полезны для таких вещей, как тестирование фреймворков.
Однако я думаю, что сходить с ума от добавления пользовательских атрибутов может быть излишним.Лично я люблю использовать атрибуты, но стараюсь свести их использование к минимуму и использовать их только там, где они имеют наибольший смысл.