Есть ли альтернатива большим грязным атрибутам? - PullRequest
19 голосов
/ 19 мая 2011

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

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

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

Есть ли альтернатива большим атрибутам?


Как случайный пример того, о чем я говорю:

[SoapDocumentMethod(
    "http://services.acme.co.uk/account/Web/GetCustomerDetails/GetCustomerDetails", 
    RequestNamespace = "http://services.acme.co.uk/account/Web", 
    ResponseNamespace = "http://services.acme.co.uk/account/Web", 
    Use = SoapBindingUse.Literal, 
    ParameterStyle = SoapParameterStyle.Wrapped)]
public Response GetCustomerDetails(Request request)
{
    //...
}

Ответы [ 3 ]

8 голосов
/ 19 мая 2011

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

[SoapDocumentMethod(
    URL, RequestNamespace = NAMESPACE, ResponseNamespace = NAMESPACE, 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public Response GetCustomerDetails(Request request)
{
    //...
}
4 голосов
/ 19 мая 2011

С моей точки зрения, есть много вариантов.

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

Узнайте больше о T4 на http://msdn.microsoft.com/en-us/library/ff697195.aspx

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

О читабельности можно использоватьрегионы, чтобы скрыть атрибуты членов.

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

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

РЕДАКТИРОВАТЬ

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

Примером этого может быть:

[SomeFake]
public void A() {}

... and after code generation

[SomeActual(Allow = true, Loggable = true)]
public void A() {}
2 голосов
/ 19 мая 2011

Объявление URL-адресов в виде константных строк, определенных в другом месте, может быть началом

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...