2011-05-19 10 views
20

A menudo encuentro que los atributos pueden ser demasiado grandes. A veces parece que los atributos ocupan más de la pantalla que el código. Puede hacer que sea difícil detectar los nombres de los métodos.¿Existe una alternativa a los grandes atributos desordenados?

Además, no son reutilizables, por lo que puede terminar repitiendo mucho sus valores.

Para contrarrestar esto consideré crear mi propia clase de atributo, que hereda del atributo requerido, y simplemente establece todas las propiedades a los valores predeterminados que necesito.
Sin embargo, en la mayoría de los casos los atributos están sellados, poniendo fin a mis esquemas.

¿Hay alguna alternativa a los atributos grandes?


Como ejemplo al azar de lo que estoy hablando:

[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) 
{ 
    //... 
} 
+1

+ 1, esto es una buena pregunta .. –

+0

En lugar de luchar con los atributos desordenado a menudo es mejor movimiento para marco que soporta la configuración fluidez y sin atributos (ServiceStack/FluentValidation/Autofac/Entity Fluent API). – Lightman

Respuesta

4

Desde mi punto de vista, hay muchas opciones.

Uno sería con generación de código. Puede usar el motor T4 para leer algún archivo de configuración y aplicar algunos atributos a un miembro arbitrario.

Más información sobre T4 enhttp://msdn.microsoft.com/en-us/library/ff697195.aspx

A veces alguna clase es parte de una jerarquía y se puede utilizar algún atributo de un miembro de abstracta o virtual, las clases que se obtengan por la redefinición de estas no necesitarían ese atributo, ya que es declarado ya en el miembro base.

Acerca de la legibilidad, puede usar regiones para ocultar los atributos de los miembros.

De todos modos, voy a sugerir el enfoque de generación de código, porque es la solución más simple y más limpia. Correcto, esta no es una alternativa, porque tendrás el código exacto, pero evitarás hacerlo a mano.

Finalmente, la mayoría de las API .NET y de terceros le permiten configurar cosas con atributos o con algún modelo de objetos, por lo que, tal vez, cuando vea que tiene su código lleno de atributos, algunas cosas podrían ser creado al crear su propio esquema de configuración y usar el modelo de objetos de la biblioteca para configurar su entorno.

EDITAR

Quiero añadir que si te gusta el enfoque código de generación, puede utilizar los atributos personalizados que serán reemplazadas por las correctas cuando alguna plantilla de código se ejecutará en algún archivo.

Una muestra de que podría ser:

[SomeFake] 
public void A() {} 

... and after code generation 

[SomeActual(Allow = true, Loggable = true)] 
public void A() {} 
+0

+1 Me gusta mucho el enfoque de generación de código con T4. –

+0

Impresionante. Había oído hablar de T4 antes, pero realmente no sabía de qué se trataba. También prefiero la idea de región sobre líneas simples de código. –

+0

Gracias. T4 es un muy buen amigo para muchos casos y creo que este es uno de los más comunes: deja a máquina lo que un humano odia :) –

8

Si bien no resuelve todos sus problemas, usted debe utilizar constantes de sus valores repetidos, especialmente cadenas.

[SoapDocumentMethod(
    URL, RequestNamespace = NAMESPACE, ResponseNamespace = NAMESPACE, 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] 
public Response GetCustomerDetails(Request request) 
{ 
    //... 
} 
+0

Sí, supongo que podría hacer una clase AttributeManager para mantener todas estas cadenas para mí, pero realmente no obtiene el origen del problema. –

+0

@Buh Buh Estoy de acuerdo con un punto. Me gusta [la respuesta de Matias] (http://stackoverflow.com/questions/6057577/is-there-an-alternative-to-large-messy-attributes/6057804#6057804) mejor. Simplemente considere las desventajas de alejar los metadatos del método. –

2

Declarar las direcciones URL como cadenas const definidos en otros lugares podrían ser un comienzo

Además, ¿quién dice que necesita una nueva línea de personajes de X? Solo tiene una larga lista de códigos, y las personas que se preocupan pueden desplazarse para leer los parámetros.

+0

"¿quién dice que necesitas una nueva línea después de X caracteres?" - StyleCop. Diciendo eso, estoy de acuerdo contigo, Mark. – StuperUser

+0

SyleCop tiene algo útil que contarle sobre 1 de cada 1000 advertencias que encuentro –

+0

Me por una. Las largas colas son una de mis mayores preocupaciones. Espesialmente en Stack Overflow porque el navegador de mi teléfono no se puede desplazar hacia la derecha en las muestras de código por algún tiempo. Muy molesto. Aunque creo que, en este caso, podría ser el menor de dos males. Me interesaría probar usando #region y ver si eso ayuda o simplemente se vuelve más molesto. –

Cuestiones relacionadas