2009-04-29 11 views
38

Quiero ser capaz de distinguir entre una versión genérica y una versión normal (no genérica) de una clase. Al igual que el .NET Framework hace con sus versiones genéricas y no genéricas de varias de sus interfaces y clases de colección. (Queue, Queue(T))Convención para nombres de archivo de clases genéricas

Generalmente me gusta seguir la convención de una clase por archivo (como en Java). ¿Existe una convención común para nombrar archivos que contengan una sola clase genérica? Estoy interesado principalmente en Windows (NTFS específicamente) pero parece que una buena convención sería (al menos un poco) portátil.

+0

Podría dar un ejemplo de una clase que tanto un tipo específico y genérico con el mismo nombre (que probablemente no es una idea fantástica para empezar?) El .NET no los tipos genéricos solo existen para compatibilidad con versiones anteriores. –

+2

"¿Podría dar un ejemplo de una clase que tenga un tipo genérico y específico con el mismo nombre?": Usted mismo ha proporcionado una respuesta: ¡una biblioteca de clases que necesita compatibilidad con versiones anteriores! – Joe

Respuesta

29

En Microsoft, que utilizan ClassNameOfT.cs

+0

Me gusta esto, bastante claro. Aunque probablemente todavía nombre la clase igual que la versión no genérica. –

+3

Supongo que me pregunto cómo harían algo así como un diccionario. DictionaryOfKT? – user7116

+8

En el código fuente ASP.NET MVC 1.0 utilizan la convención Dictionary'2.cs. – mckamey

1

¿Qué tal:

Type.cs 

y

TypeGeneric.cs 

Cada vez que he hecho esto en el pasado siempre he poner los dos tipos en un archivo con el tipo no genérico como el nombre del archivo. Creo que esto deja las cosas bastante claras ya que .NET no tiene convenciones/restricciones en un tipo por archivo como lo hace Java.

Pero si debe, entonces sugeriría algo como lo que tengo arriba, y usar un sufijo hará que los archivos se muestren juntos en cualquier lista alfabética (Solution Explorer, Windows Explorer, etc.).

Aquí es otra idea:

Type`1.cs 

Esto permitirá romper a cabo diferentes tipos genéricos por el número de parámetros de tipo genérico que aceptaron. Sin embargo, es sólo un pensamiento, ya que todavía creo que sería más simple poner todos los tipos en un solo archivo.

0

Probablemente tenga dos carpetas en el proyecto, algo así como Gereric, NonGeneric o algo así. Todavía pueden estar en el mismo espacio de nombres, y luego ambos pueden tener el mismo nombre de archivo. Solo un pensamiento ...

+5

Personalmente trato de evitar clases en el mismo espacio de nombres en diferentes carpetas. Me gusta la jerarquía de carpetas para que coincida con la jerarquía del espacio de nombres, para el beneficio de los desarrolladores del mañana. – Joe

+0

Bastante justo. Probablemente los tendría en un nombre diferente de todos modos. Algo como MyProj. y MyProj.Generic. – BFree

0

Todas las clases nuevas de Microsoft usan genéricos. El Queue y ArrayList estaban allí antes de que salieran los genéricos. Los genéricos son el camino a seguir.

La convención para el archivo de una clase por archivo es nombrar el nombre del archivo después del nombre de la clase (si es genérico de no). Para MyClass, tendrás MyClas.cs. Para cada nuevo espacio de nombres necesitarás crear una nueva carpeta. Así es como funciona Visual Studio.

1

Probablemente los pondría en carpetas y usaría el mecanismo del espacio de nombres en su lugar. Puede comparar con System.Collections vs. System.Collections.Generic. Por otro lado, si es más común que no que las clases usen genéricos, quizás sea mejor señalar aquellas que no lo son. Eso es si realmente desea separar las clases genéricas de otras clases. Personalmente, normalmente no me molesto en hacer eso, ya que realmente no veo un beneficio práctico de ello.

1

De las respuestas hasta ahora parece que no hay consenso.

Usando el mismo nombre de archivo en un espacio de nombres secundario (y subcarpeta) "Generics" (como System.Collecctions.Generics) es una opción. Pero no siempre es deseable crear un nuevo espacio de nombres.

Por ejemplo, en un espacio de nombres existente con clases no genéricas que se mantienen por compatibilidad con versiones anteriores, pero marcadas con ObsoleteAttribute, es probable que sea mejor mantener las versiones genéricas en el mismo espacio de nombres.

Creo que un sufijo es una forma razonable de hacerlo. He adoptado una convención de usar los parámetros de tipo como sufijo (por lo que: MyClassT para MiClase < T> o MyDictionaryKV para MyDictionary < K, V>

36

Justo.. encontré esta pregunta después de buscar lo convenciones otras personas utilizan para nombres de archivo de clases genéricas

Últimamente he estado usando ClassName[T].cs me gusta mucho esta convención, y yo creo que es superior a los demás por las siguientes razones:..

  • Los parámetros de tipo brindan un poco más de que con la convención de Microsoft (por ejemplo, ClassNameOfT.cs).
  • Se le permite tener múltiples parámetros tipo sin demasiada confusión : Dictionary[TKey, TValue].cs
  • que no requiere que usted para crear las carpetas especiales, o para tener sus clases genéricas en un espacio de nombres especial. Si solo tiene unas pocas clases genéricas, tener un espacio de nombre especial dedicado a ellas simplemente no es práctico.

I prestado esta convención de sintaxis genérica Boo 's, aunque ligeramente modificado (Boo utiliza ClassName[of T]).

Algunos desarrolladores parecen tener una fobia a los nombres de archivos que contienen cualquier cosa menos letras y guiones bajos, pero una vez que se puede pasar, esta convención parece funcionar extremadamente bien.

+35

+1 He estado usando DOS/Windows durante casi 30 años y nunca he conocido a nadie con las bolas para usar una coma en un nombre de archivo. –

+7

@ I.J.Kennedy Los hombres REALES usan punto y coma (;) en sus nombres de carpeta y los ponen en variables de entorno (RUTA). – enzi

+0

Me encantó esta convención cuando la leí por primera vez, pero por alguna razón algunas extensiones (ejem, CodeMaid) se vuelven locas cuando tienes archivos nombrados usando esta convención, como 'IFoo.cs' y' IFoo [T] .cs'. Cuando la extensión se ejecuta para limpiar el documento no genérico, siempre afecta al genérico en su lugar ... Comportamiento extraño. – Dan

8

veo que este tema ha sido abandonado hace más de un año, pero aún así me gustaría compartir mi punto de vista sobre esta convención.

En primer lugar, tener múltiples clases que tengan el mismo nombre pero solo difieran en la cantidad de parámetros de tipo no siempre es un caso de compatibilidad con versiones anteriores. Seguramente, no lo ve muy a menudo, pero las nuevas clases de Action y Func de .NET se diseñaron de esta manera, y actualmente estoy implementando algo similar.

Para mayor claridad y distinguibilidad, uso la siguiente convención que sólo especifica el número de argumentos genéricos para un tipo dado:

  • MyClass.cs
  • MyClass.T1.cs
  • MyClass.T2 .cs

De esta forma, mis nombres de archivo permanecen cortos y simples a la vez que comunican claramente el nombre de clase y la cantidad diferente de parámetros de tipo a costa de un simple punto extra (que es, en mi experiencia, una cosa comúnmente aceptada para hacer en un nombre de archivo y se ve mucho mejor que las comas y otros caracteres no alfanuméricos, pero esto es solo una cuestión de gusto, supongo).Poner los nombres (o acrónimos) de los parámetros de tipo simplemente alarga los nombres de los archivos, mientras que en este nivel no estoy realmente interesado en los nombres reales de los parámetros de tipo ...

+0

Todavía estoy prestando atención. Gracias por el aporte. :-) –

+0

+1, Realmente me gusta! Es simple, breve, suficientemente claro/suficientemente informativo (a nivel de nombre de archivo) y no debe desencadenar demasiados "símbolos-fobias" por ahí. Sin embargo, como una variante, el primer punto podría reemplazarse con un guión bajo para aquellos casos en que no sean deseables los puntos múltiples. O como es el caso para mí: uso múltiples puntos para las clases internas (a menos que sean menos de ~ 10 líneas). Entonces, por ejemplo: 'MyClass.InnerClass.cs' o un ejemplo combinado con esto para los genéricos' MyClass_T2.InnerClass.cs'. (Me gusta usar puntos para las clases internas porque refleja la forma en que se hace referencia en el código). – AnorZaken

0

Personalmente, no usaría el acento grave Notación:

Foo.cs 
Foo`1.cs 

Por la sencilla razón de que tengo miedo del acento grave. No solo tiene un nombre aterrador, pero no estoy seguro de cómo será manejado por los diferentes sistemas de archivos, sistemas de control de versiones y en las URL. Por lo tanto, preferiría mantener los caracteres alfanuméricos comunes.

NameOfT.cs parece ser utilizado en ASP.NET Core MVC según una búsqueda en GitHub. 12 resultados Reference.

También uso limitado en CoreFX. 3 resultados Reference.

Ejemplo:

Foo.cs 
FooOfT.cs 
Cuestiones relacionadas