2010-04-09 10 views
11

Estoy escribiendo un par de clases que tienen argumentos de tipo genérico, pero necesito sobrecargar las clases porque necesito una cantidad diferente de argumentos en diferentes escenarios. Básicamente, tengo¿Qué debo nombrar mis archivos con definiciones de clases genéricas?

public class MyGenericClass<T> { ... } 
public class MyGenericClass<T, K> { ... } 
public class MyGenericClass<T, K, L> { ... } 
// it could go on forever, but it won't... 

Los quiero a todos en el mismo espacio de nombres, pero en un archivo fuente por clase. ¿Qué debo nombrar los archivos? ¿Hay una mejor práctica?

+2

No pensé que fuera posible crear diferentes clases con el mismo nombre pero con un número diferente de argumentos genéricos. EDITAR: oops, esto es C#, no Java. Dudo que puedas hacer esto en Java, debido a la manera divertida que tiene para manejar clases genéricas. –

+0

¿Microsoft no hace esto con la clase 'Tuple' en 4.0? –

+0

Véase, por ejemplo, Tupla - Representa una tupla de tamaño 1 Tupla - Representa una tupla de tamaño 2 Tupla - Representa una tupla de tamaño 3 – JasonTrue

Respuesta

9

gente que he visto usan

MyGenericClass`1, MyGenericClass`2 or MyGenericClass`3 

(el número es el número de parámetros genéricos).

Creo que eso es lo que obtienes como un TypeName cuando llamas a .ToString en la clase.

+1

También XML docs usa esto, y las definiciones IOC –

+3

El argumento '.ToString()' es de lejos el mejor que he visto en las discusiones sobre esto hasta el momento. A menos que surja algo que se deshaga en el día siguiente, probablemente sea esto lo que haré. –

+0

De acuerdo. Esto es lo que aparece en los resultados de la cobertura del código también. –

1

Creo que no encontrarás mucho dogma en la comunidad de C# que favorezca archivos separados para cada variante de una clase genérica con el mismo nombre; Prefiero solo usar uno para el caso que está describiendo, aunque podría ver un caso para lo que está proponiendo si el código es necesariamente complejo/largo para cada variación. En general, solo usaría el nombre de la clase en cuestión como el nombre del archivo.

Si tuviera que separar las variantes en archivos separados, podría ver el uso de la solución de Michael, aunque sería un poco doloroso para aquellos de nosotros que usamos herramientas de estilo Unix en la línea de comando, por ejemplo, Cygwin o AndLinux. Probablemente usaría un guión bajo o ningún signo de puntuación. O algo así como 1P, 2P, 3P como el sufijo.

1

Pondré todas en el mismo archivo a menos que sean grandes (que normalmente no serán, excepto la que tenga más Ts).

No es realmente una mejor práctica para nombrar clases además de lo que se encuentra en las directrices de .NET Framework, ya que es parte del lado creativo de la programación, y desafortunadamente el SSCLI solo vuelve a 2.0 para que no pueda encuentra mucha ayuda allí.

1

lo general el uso Classname.1.cs, Classname.2.cs, etc ... donde el número es el número de argumentos genéricos, similar a la `` 1 notation used in the framework documentation (and in XML documentation in your sourcecode). Sometimes you also have a class with no generic arguments (similar to ICollection and ICollection` en el marco), y el nombre del archivo sería simplemente el nombre de la clase , como se esperaba. En contraste con el uso de un backtick, esto tiene la ventaja de que no tendrá caracteres inválidos en el nombre del archivo. No todos los sistemas de archivos, sistemas de control de versiones, sistemas operativos permiten un carácter de retroceso en el nombre.

2

Cuando se produce esta situación adopto la misma convención que se utiliza en los comentarios de la documentación XML para C# genéricos, que consiste en utilizar { y } en lugar de < y > porque paréntesis angulares no son amables en XML o nombres de archivos pero los rizados son. Así que algo como:

MiClase {T} .CS

MiClase {t, k} .CS

Si realmente tiene muchos parámetros, sin embargo, esto puede ser poco difícil de manejar como una nombrando el esquema, entonces yo tendería a adoptar la convención CLR de backtick seguido de conteo de parámetros, por ejemplo

MyClass`1.cs

MyClass`2.cs

O mezclar y combinar los dos esquemas que se adapta a la situación.

Cuestiones relacionadas