c# - una - tipos de genericos
Convención para nombres de archivo de clases genéricas (11)
Quiero ser capaz de distinguir entre una versión genérica y una versión regular (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) )
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.
A veces también veo ClassName{T}.cs
pero es común ClassNameOfT.cs
(como se menciona antes de que Microsoft lo use)
El proyecto EntityFrameworkCore (también de Microsoft) utiliza ClassName`.cs
Acabo de encontrar esta pregunta después de buscar qué convenciones usan otras personas para nombres genéricos de archivos de clases.
Últimamente he estado usando ClassName[T].cs
. Me gusta mucho esta convención, y creo que es superior a las demás por los siguientes motivos:
- Los parámetros de tipo saltan un poco más de lo que lo hacen con la convención de Microsoft (p. Ej.,
ClassNameOfT.cs
). - Le permite tener múltiples parámetros de tipo sin demasiada confusión:
Dictionary[TKey, TValue].cs
- No requiere que cree ninguna carpeta especial ni que tenga sus clases genéricas en un espacio de nombre especial. Si solo tiene unas pocas clases genéricas, tener un espacio de nombre especial dedicado a ellas simplemente no es práctico.
Tomé prestada esta convención de la sintaxis genérica de Boo , aunque ligeramente modificada (Boo usa ClassName[of T]
).
Algunos desarrolladores parecen tener una fobia a los nombres de archivo que contienen todo menos letras y guiones bajos, pero una vez que puedes pasar, esta convención parece funcionar extremadamente bien.
De las respuestas hasta ahora parece que no hay consenso.
Usar el mismo nombre de archivo en un espacio de nombres secundario (y subcarpeta) es una opción "Generics" (como System.Collecctions.Generics). 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 marcado con ObsoleteAttribute, probablemente 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 un sufijo (entonces: MyClassT para MyClass <T>, o MyDictionaryKV para MyDictionary <K, V>.
No use el acento grave `en los nombres genéricos de los archivos si está ejecutando Visual Studio 2008. Hay un problema conocido con ellos que hace que los puntos de interrupción fallen:
Personalmente, no usaría la notación de acento grave:
Foo.cs
Foo`1.cs
Por la simple razón de que tengo miedo del acento grave. No solo tiene un nombre temible 👻😨😱, 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 usarse en ASP.NET Core MVC de acuerdo con una búsqueda en GitHub. 12 resultados Reference .
También uso limitado en CoreFX. 3 resultados Reference .
Ejemplo:
Foo.cs
FooOfT.cs
Probablemente los pondría en carpetas y usaría el mecanismo del espacio de nombres. 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.
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...
Qué tal si:
Type.cs
y
TypeGeneric.cs
Cada vez que he hecho esto en el pasado, siempre he puesto ambos 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 es así, sugeriría algo como lo anterior, y el uso de un sufijo hará que los archivos se muestren juntos en cualquier lista alfabética (Solution Explorer, Windows Explorer, etc.).
Aquí hay otra idea:
Type`1.cs
Esto le permitiría dividir diferentes tipos genéricos por la cantidad de parámetros de tipo genérico que ellos 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.
Todas las clases nuevas de Microsoft usan genéricos. The 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 sola clase por nombre es nombrar el nombre del archivo después del nombre de la clase (ya sea 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.
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 tienen el mismo nombre pero solo difieren 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 distinción, utilizo la siguiente convención que solo 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 mientras sigo comunicando claramente el nombre de clase y la cantidad diferente de parámetros de tipo a costa de un punto extra simple (que, en mi experiencia, es una cosa comúnmente aceptada en un nombre de archivo y se ve mucho mejor que las comas y otros personajes no alfanuméricos, pero creo que es solo cuestión de gustos). Poner los nombres (o acrónimos) de los parámetros de tipo solo 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 de todos modos ...
En Microsoft, usan ClassNameOfT.cs
.