2010-06-24 16 views
36

Estoy tratando de apegarme a las convenciones generales de nomenclatura como las que se describen en Design Guidelines for Developing Class Libraries. Puse cada tipo en su propio archivo fuente (y las clases parciales se dividirán en varios archivos como se describe en la pregunta Naming Conventions for Partial Class Files), usando el nombre del tipo como el nombre del archivo.Cómo nombrar archivos fuente C# para las clases genéricas

Ejemplos:

namespace Demo.Bla       // project 
{ 
    enum FlowDirection { }     // in file FlowDirection.cs 
    class LayoutManager { }    // in file LayoutManager.cs 
} 

namespace Demo.Bla.LayoutControllers  // folder LayoutControllers in project 
{ 
    class StackPanelLayoutController { } // in file LayoutControllers/StackPanelLayoutController 
} 

Pero no estoy seguro de que he llegado con una forma inteligente de nombrar los archivos de origen que contienen las clases genéricas. Decir que tengo después de clases, por ejemplo:

namespace Demo.Bla.Collections    // folder Collections 
{ 
    class Map<T> { }      // in file Map.cs (obviously) 
    class Bag { }       // in file Bag.cs (obviously) 
    class Bag<T> : Bag { }     // also in file Bag.cs ??? 
} 

¿Debo poner el código tanto de la no-genérico y los genéricos Bag clases en el mismo archivo Bag.cs? ¿Cuáles son tus hábitos?

+1

Muy buena pregunta. – Marcel

+1

Dup posible: http://stackoverflow.com/questions/2611639/what-should-i-name-my-files-with-generic-class-definitions – Jehof

+1

@Jehof: Relacionado, pero no un dup. Esta es una pregunta genérica/no genérica (y también una pregunta de convención de nomenclatura). –

Respuesta

1

En el repositorio CoreFX GitHub, Microsoft está siguiendo la convención back-garrapata se describe en respuesta Matthias Jakobsson 's:

enter image description here

Así que, básicamente:

class ImmutableArray { }      // ImmutableArray.cs 
class ImmutableArray<T> { }     // ImmutableArray`1.cs 
... 
class ImmutableDictionary<TKey, TValue> { } // ImmutableDictionary`2.cs 

Y para clases definidas dentro de otras clases, el nombre está compuesto por clase externa seguida por + y por el nombre de la clase interna (Outer+Inner.cs):

partial class ImmutableArray<T>    // ImmutableArray`1+Builder.cs 
{ 
    class Builder { } 
} 
+2

Sé que esto tiene un año, pero quería señalar que este enfoque para nombrar ya no se usa en el enlace CoreFX que ha proporcionado. Ahora usan un guión bajo en lugar de un tic y un punto en lugar de un signo de más. Entonces 'ImmutableArray'1 + Builder.cs' ahora sería 'ImmutableArray_1.Builder.cs' –

5

Por lo general, si tengo varios tipos "sobrecargados" por el número de parámetros de tipo, es porque uno deriva del otro o uno se usa para crear el otro. Simplemente los puse en el mismo archivo.

Una opción alternativa sería dividirlos en archivos diferentes, hacer que un archivo sea el "primario" y los otros "dependan" del archivo de compilación, según la pregunta de clase parcial a la que se vinculó en la pregunta .

De esta manera podría terminar con un enlace visual en Visual Studio, pero aún así una clase por archivo para que sea más fácil trabajar con ellos.

0

Agrego un sufijo 'T' a los nombres de mis clases genéricas.

class Bag { }       // in file Bag.cs 
class BagT<T> : Bag { }     // in file BagT.cs 
class BagInputs : BagT<Input>   // in file BagInputs.cs 

Usted preguntó,

¿Debo poner el código tanto de la no genérica y las clases Bolsa genéricos en el mismo archivo Bag.cs? ¿Cuáles son tus hábitos?

La anterior convención mía no es estándar; Debo aclarar que estaba respondiendo "cuáles son mis hábitos" y no necesariamente "lo que debes hacer".

+4

Eso me parece un tanto inusual. ¿Qué hubieras hecho si estuvieras diseñando los tipos 'Tuple' en .NET 4? –

+1

@Jon - Sí, inusual: uso algunas convenciones de nomenclatura no estándar, no necesariamente como las convenciones de nomenclatura de los tipos de biblioteca .NET. No he encontrado esos tipos de 'Tuple' antes, pero supongo que los habría llamado a todos' TupleT' en el mismo 'TupleT.cs'. – ChrisW

+1

Interesante; gracias por la idea, pero no me gusta mucho. No encaja con todos los otros tipos genéricos utilizados en .NET ('List ' se convertiría en 'ListT ', lo cual me parece realmente incómodo). –

38

Creo que la solución común a este problema es nombrar el archivo de la siguiente manera:

{ClassName}`{NumberOfGenericParameters} 

Esto le daría a este nombre de archivo:

Bag.cs and Bag`1.cs 

Ésta es la forma en que Microsoft manejar esta cuestión en marcos como Asp.net Mvc.

+0

Oh, no me había dado cuenta de que el backtick es un carácter legal en los nombres de los archivos (en Windows, al menos). Entonces esto significa que cualquier tipo genérico debe tener un backtick y un número en su nombre. Hmmm, tendré que pensar en esto. Gracias. –

+1

@Pierre, sí. Así es como yo resuelvo el problema. Sin embargo, cuando solo tengo la clase genérica y no la versión no genérica, generalmente no pongo el carácter de retroceso en el nombre del archivo. Entonces, en su caso, tendría la clase Map genérica en un archivo llamado "Map.cs". –

+0

+1 - Esta parece ser la convención sensata. – Fenton

16

he visto algunas bibliotecas utilizando

Bag.cs 
Bag`1.cs 
Bag`2.cs 

ya que esto es lo que podría mostrar la Type.Name.

Quiero ser más descriptivo con los parámetros de tipo así que últimamente tienden a utilizar

Bag.cs 
Bag{T}.cs 
Bag{TKey, TValue}.cs 

Este es un formato que también es apoyado por los comentarios XML.

/// <summary> 
/// ... 
/// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class. 
/// </summary> 
+0

der welten - Gracias por la sugerencia. Me gusta la idea de poner los parámetros de tipo directamente en el nombre de archivo mejor que el esquema de nomenclatura de números atrás más rápido + número. –

+0

Sí, este enfoque parece más legible. Gracias. –

Cuestiones relacionadas