Считаете ли вы атрибуты C# (или подобные механизмы) хорошей идеей или вы не одобряете их использование?

StackOverflow https://stackoverflow.com/questions/761537

Вопрос

За последние 4–5 лет я создал множество проектов и фреймворков, использующих атрибуты C#.

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

Я нашел их настоящей находкой, но теперь начинаю задаваться вопросом, чего мне не хватает.

Чтобы уточнить:Использование соглашения вместо конфигурации становится основным принципом, которому необходимо следовать, особенно в области ORM.В этой области вы можете сопоставить поля с файлом конфигурации (XML), использовать атрибут или использовать общее соглашение об именах, которое напрямую сопоставляется с полями в таблицах вашей базы данных.У меня нет никаких ссылок на цитаты, но я читал некоторые негативные отзывы о добавлении еще одного Атрибута в смесь.

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

Это было полезно?

Решение

На самом деле атрибуты служат двум целям:как вещи, видимые пользователем, и как вещи, создаваемые компилятором.

Я предполагаю, что вы говорите о видимых пользователем атрибутах.

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

Большую часть времени они используются для внедрения какой-либо формы пользовательского языка поверх C#.Атрибуты DLINQ являются хорошим примером этого.Лучшим подходом, с точки зрения потребителя, было бы добавить первоклассную поддержку к основному языку.В конечном итоге это будет выглядеть гораздо более естественно.(с языковой поддержкой для определения таблиц и внешних ключей было бы гораздо проще работать, чем со всеми этими сумасшедшими атрибутами linq-to-sql).

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

Возможно, когда-нибудь в C# появятся функции метапрограммирования, которые упростят выполнение подобных задач.

Однако на данный момент такой возможности не существует.

Это оставляет вам 3 варианта:

  1. Использовать атрибуты
  2. Используйте динамический язык и генерируйте код во время выполнения.
  3. Просто не используйте генеративное программирование

Обычно вариант №1 оказывается самым простым выбором, даже если он не идеален.

Другие советы

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

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

Я, конечно, видел пару реализаций, в которых люди немного злоупотребляли ими, но ничего особенного.Вы можете быть более конкретным?Есть ли конкретные атрибуты/фреймворки, о которых вы говорите?

Это довольно широкий вопрос, например: «Должен ли я положить сыр в запеканку»;Ответ на оба вопроса: «Это зависит от того, что вы делаете».

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

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

Я считаю их чрезвычайно полезными, когда дело доходит до определения метаданных о моем коде.Я использую их для создания пользовательских отчетов, для архитектуры плагинов и для взаимодействия со сторонним кодом.

Полагаю, можно делать все по соглашению, но они мне нравятся.

Я вижу интенсивное использование атрибутов в ASP.NET MVC.Фактически, переход на MVC позволил мне значительно расширить использование атрибутов.Я не уверен, откуда взялось ваше восприятие негативной реакции против атрибутов, но я определенно не вижу ее в MS, по крайней мере, в отношении MVC.

Мне особенно нравится, как атрибуты можно использовать для обеспечения сквозного поведения (аспектов) для тех контроллеров/действий, которые оформлены таким образом.Видя, как MVC устроен для обработки вызова атрибутов до и после вызова действия, я должен поверить, что это предпочтительный способ заставить аспекты работать в MVC.

Что ж, если использовать ASP.NET MVC, я бы сказал, не беспокойтесь об этом.В этом фреймворке сделано так много с использованием отражения и атрибутов, что я не вижу в этом никаких проблем.MVC — довольно новая среда, и она используется повсюду.От проверки ввода, обработки ошибок до замечательного атрибута ActionFilter — их очень много.Так нет, лично я не вижу в них ничего плохого.

Лично я считаю, что атрибуты, как и большинство особенностей языка, имеют свое место, но ими можно злоупотреблять или злоупотреблять.

В правильных рамках они бесценны.Они определенно упрощают такие вещи, как DI-фреймворки (МЭФ это отличный пример) и очень, очень полезны для таких вещей, как тестирование фреймворков.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top