2009-10-29 22 views
13

¿Existen convenciones de nomenclatura o codificación establecidas para definir namespace or type aliases en C#?Convenciones de alias de tipo/espacio de nombres en C#

Para aquellos que no lo saben, el lenguaje C# tiene una característica donde los alias se pueden definir localmente en un archivo para espacios de nombres y tipos. Esto puede ser útil cuando hay conflictos de nombres con bibliotecas de terceros, así como para acortar los nombres de tipo dentro de su código. A continuación se muestra un ejemplo de cómo se ve.

using Forms = System.Windows.Forms; 

mayoría de los ejemplos que he visto en la web tienden a utilizar nombres en mayúsculas sin abreviar como alias como el alias Formas en el ejemplo anterior. En algunos lugares, incluido el official MSDN page, que explica el ejemplo con un alias de colAlias ​​ para el espacio de nombres System.Collections. Para hacerlo más complicado, puede haber una preferencia para que algunos elijan diferentes pautas dependiendo de si se está definiendo un alias de espacio de nombres o un alias de tipo.

Con el fin de dar algunos antecedentes de por qué estoy interesado en las directrices con nombres de alias explicaré lo que estoy haciendo. En un proyecto reciente comencé a simplificar un patrón en el que tengo varias clases que heredan de una clase base genérica que acepta argumentos de tipo complejo mediante el uso de alias de tipo.

Por lo tanto, utilizando esta técnica, el ejemplo complejo siguiente se convierte en mucho más legible una vez que se aplican los alias de tipo.

public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>> 
{ 
    public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation) 
    { 
     // ... 
    } 
} 

Y debajo de la versión del limpiador de alfombras con alias de tipo.

using Result = List<SomeValueType>; 
using Algorithm = TripleLindyFancyAlgorithm<List<SomeValueType>>; // Note: cannot reference an alias within an alias definition! 

public class MyClass: MyGenericBaseClass<Algorithm, Result> 
{ 
    public override Result DoSomething(Algorithm operation) 
    { 
     // ... 
    } 
} 

Aunque esto parece mucho más simple, es fácil olvidar que un alias como resultado es en realidad un alias para la lista y que no hay ningún tipo real llamada Resultado. Para separar los conceptos visualmente, estoy considerando seguir alguna convención de prefijación similar al uso del guión bajo '_' antes que los miembros privados para ayudar a distinguir los alias de tipo de los tipos reales. Antes de hacerlo, sin embargo, quiero asegurarme de que no estoy reinventando la rueda ya que tal vez ya existan convenciones más establecidas.

Respuesta

9

Los alias de espacio de nombres no son una característica común de la mayoría de las bases de códigos: el último lugar cuando lo he usado, el desarrollador principal no estaba familiarizado con él, aunque trabajó con C# durante muchos años.

Como es raro, las convenciones no se han desarrollado para ello.

Diría que si va a usar alias, discuta esto con su equipo para crear su propia convención.

Varias maneras diferentes que he visto alias utilizados:

  • un acrónimo del espacio de nombres. Por lo general, las mayúsculas en el espacio de nombres.
  • El final del espacio de nombre - si plural plural-pluralized.
  • Un nombre corto descriptivo.
+1

Genial, esta es realmente la primera publicación que discute las convenciones, que es lo que originalmente me propuse plantear esta pregunta. – jpierson

+0

Se concede la recompensa. Gracias por responder a la pregunta que se hizo (es decir, no solo por expresar su preferencia) y respaldarla con la experiencia del mundo real. –

+0

@MatthewStrawbridge - Gracias por eso. Como dices, las otras respuestas no parecen abordar la pregunta en absoluto, sino que establecen las preferencias personales. La disparidad en la respuesta también muestra que, de hecho, no hay consenso sobre convenciones para alias de espacio de nombres ... – Oded

6

Personalmente, solo lo usaría para mantener la inteligencia limpia.

using StringBuilder = System.Text.StringBuilder; 

Si cambia el nombre de los tipos, se abre la caja de Pandora para los programadores de mantenimiento.

+0

Aunque estoy de acuerdo en que el uso de esta técnica en casos en los que no está garantizado sería muy malo para el mantenimiento, creo que el ejemplo complejo original sin ninguna mejora probablemente sea aún más preocupante. – jpierson

+1

Puedo estar loco, pero creo que es más legible cuando es tan explícito. – ChaosPandion

+0

ChaosPandion, tal vez su derecho. Sin embargo, el punto principal es discutir las convenciones de nombres, aunque creo que es importante considerar las pautas de codificación con respecto al uso de alias. – jpierson

14

Solo usaría alias en el caso de conflicto de espacio de nombres (es decir, solo si I tenía).

Para mí, al menos, cualquier otro uso es confuso y una distracción.

+2

Pero debe admitir que en el ejemplo que proporcioné, si tenía que escribir más de 100 clases similares que tenían el mismo patrón que la función de alias de tipo, mejora notablemente la legibilidad. Aunque estoy de acuerdo en que puede ser confuso, creo que en este tipo de ejemplo, en realidad es tanto o más confuso dejar el ejemplo complejo como está. – jpierson

+0

sobre el ejemplo: genéricos de anidamiento que en profundidad casi nunca serían necesarios y, si lo son, es una señal de que las clases deberían rediseñarse, en lugar de un letrero que debería usarse. eso es demasiado confuso para los mortales. –

+0

@Dave - Un punto muy válido, aunque para entrar en detalles del diseño tendría que divulgar detalles del código real que me impulsó a hacer esta pregunta.Por el bien de ser productivo, intentaré enfocar menos el enfoque en qué tan razonable es el ejemplo y si se debe usar el alias de tipo o no, y más en las convenciones para los alias de tipo en el código C#. – jpierson

4

Los dos casos más comunes de los alias de espacio de nombres son:

  1. lo vi y lo uso (como tendencia)
  2. I Código puerto de otro idioma

Para el primer caso, sin comentarios. Para el segundo un buen ejemplo es portar código de C y alias uso de espacio de nombres para el sentido práctico como:

using i64 = System.Int64; 
using u8 = System.Byte; 
using u32 = System.UInt32; 
using u64 = System.UInt64; 

Incluso si se tiene en cuenta los alias anteriores como la programación flojo, ayudan a evitar errores.

+3

Su ejemplo de código no es un alias de espacio de nombres sino un aliasing (ambos hechos con una directiva 'using'). – Oded

+1

Derecha. Al igual que "usar StringBuilder = System.Text.StringBuilder;" de ChaosPandion. Mi experiencia hasta el momento dice que la mayoría de las personas lo consideran como un alias de espacio de nombres. –

+0

La mayoría de la gente probablemente los use intercambiables, si los usan en absoluto. – Oded

2

Creo que las personas que están inclinadas a no usarlas en absoluto son dando la respuesta que usted solicitó. Esa es la convención. Esto no quiere decir que no puede ser útil, pero no usarlo sigue siendo la norma.

+0

Evaluación justa, por favor considere hacer un comentario sobre la respuesta de alguien o mi pregunta original. – jpierson

+1

¿Por qué, mientras que algunos de los otros argumentan en contra del uso, ninguno dice que es la respuesta a la pregunta "¿Existen convenciones de nomenclatura o codificación establecidas para definir el espacio de nombres o escribir alias en C#?" Sí, lo hago :) –

+0

Supongo que su respuesta es "no", si es así, sería una respuesta simple y aceptable. Aunque es evidente que de otros pueblos comenta que hay algunas convenciones, aunque quizás no muy extendidas o consistentes. – jpierson

2

Podría adoptar una convención para usarlos para la abstracción.

using Id = System.Int32; 

De esta manera usted puede simplemente reemplazar esa línea con

using Id = System.Guid; 

en algún momento y ningún otro código tendría que cambiar (asumiendo que no se asomaba a través de la abstracción para crear dependencias en el tipo real ...)

+0

Esto funciona para tipos simples, pero una vez que tiene una clase o un genérico, hay algo de dolor porque los métodos rara vez se comparten entre ellos, excepto en casos muy generales como ToString(). Aunque prefiero hacer esto por la razón que mencionas, de todos modos. En realidad, MEJORA la legibilidad para especificar un tipo que tenga sentido en el contexto en el que se usa. –

0

por lo general sólo los utilizan cuando necesito usar dos clases con nombres similares en diferentes espacios de nombres, y no quiero especificar el tipo totalmente en el código:

using xItem = My.Project.NameSpace.Item; 
using yItem = Your.ThirdParty.Framework.Item; 
Cuestiones relacionadas