¿Cuál es la mejor manera de estructurar y nombrar archivos que contienen clases genéricas con el mismo nombre?

13

En mi proyecto actual he encontrado el requisito de crear clases genéricas con el mismo nombre, pero con diferentes números de parámetros genéricos. Por ejemplo:

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

Dado que quiero todos estos en el mismo espacio de nombres, estoy confundido en cuanto a cómo estructurar y nombrar mis clases y archivos.

Si seguimos la idea de que deberíamos tener clases limitadas a una por archivo y que los archivos deben estar en una estructura de carpetas que represente la jerarquía del espacio de nombres y que el nombre del archivo debe coincidir con el nombre de la clase, ¿cómo lo trato? con esta situacion?

Lo que realmente estoy preguntando aquí es cómo debería nombrar el archivo que contiene MyClass<T1> , y cómo debería nombrar el archivo que contiene MyClass<T1, T2> ? No pregunto cuáles deberían ser los nombres de los parámetros de tipo.

    
pregunta Stephen 16.01.2015 - 00:59

3 respuestas

14
MyGenericClass'1.cs
MyGenericClass'2.cs
MyGenericClass'3.cs

Y así sucesivamente, donde el número después de la marca inversa es el número de parámetros de tipo genérico. Esta convención es utilizada por Microsoft.

Alternativamente, puedes usar algo como

MyGenericCollectionClass[TKey, TValue].cs

que conserva no solo el número de parámetros de tipo genérico, sino también sus nombres específicos. Por supuesto, no conserva los corchetes angulares, pero no podemos tener todo lo que queremos en la vida, ¿verdad?

    
respondido por el Robert Harvey 16.01.2015 - 01:51
4

En el caso de Tuple y Action que Pete ha mencionado, los mismos Microsoft usan un solo archivo; consulte Tuple.cs y Action.cs .

Creo que depende en parte de si la funcionalidad para todas las clases es básicamente la misma o no. Personalmente no me gusta agrupar clases en un solo archivo, pero esto podría ser una excepción. En el código fuente donde trabajo, agregué una clase NamedTuple generada automáticamente (usando T4) que actúa de la misma manera que Tuple , pero con un nombre de cadena como primer argumento en el constructor.

Para responder a su pregunta, si no desea usar un solo archivo, tal vez use MyClass_1.cs para MyClass<T1> , MyClass_2.cs para MyClass<T1, T2> , etc.

Sin embargo, ninguna de las dos opciones es ideal, así que me inclino a sugerir el argumento "Microsoft lo hace de esta manera, así que ...".

    
respondido por el Wai Ha Lee 16.01.2015 - 01:54
0

¿Te has preguntado si las clases realmente tienen la misma intención? Si una clase es más genérica que la otra, entonces será una GenericClass , una MoreGenericClass y una MostGenericClass . Imagine que cada parámetro de tipo de una clase agrega una nueva dimensión a la clase, por lo que puede ayudar a preguntar qué dimensión es.

Tomemos este ejemplo:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

Soy consciente de que no es el mejor ejemplo, pero es muy expresivo mostrar tres dimensiones:

  • Dimensión interna, lo que puede cargar
  • Dimensión métrica, con qué métrica se puede cargar, solo por conteo de cosas o por medida cuadrada o por capacidad cúbica o por peso
  • Dimensión exterior, donde se puede cargar.

Para que puedas modelar el transporte de autos:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

Transporte de fluidos:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

Transporte de energía:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

Transporte de azúcar, cereales:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

Oh, qué sorpresa: un List<T> tiene una dimensión que representa lo que puede contener la lista; y este es un Map<T, S> con dos dimensiones que representan las cosas que el mapa puede contener y las teclas de acceso.

    
respondido por el shylynx 16.01.2015 - 09:05

Lea otras preguntas en las etiquetas