Qual è il modo migliore per strutturare e denominare file che contengono classi generiche con lo stesso nome?

13

Nel mio progetto attuale ho incontrato la necessità di creare classi generiche con lo stesso nome, ma numeri diversi di parametri generici. Ad esempio:

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

Dato che voglio tutti questi nello stesso spazio dei nomi, sono confuso su come strutturare e denominare le mie classi e file?

Se seguiamo l'idea che dovremmo avere classi limitate a una per file e che i file dovrebbero essere in una struttura di cartelle che rappresenta la gerarchia dei namespace e che il nome del file deve corrispondere al nome della classe, come faccio a trattare con questa situazione?

Quello che sto chiedendo qui è che cosa dovrei chiamare il file che contiene MyClass<T1> , e come dovrei denominare il file che contiene MyClass<T1, T2> ? Non sto chiedendo quali dovrebbero essere i nomi dei parametri del tipo.

    
posta Stephen 16.01.2015 - 00:59
fonte

3 risposte

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

E così via, dove il numero dopo l'apice è il numero di parametri di tipo generico. Questa convenzione è utilizzata da Microsoft.

In alternativa, puoi usare qualcosa come

MyGenericCollectionClass[TKey, TValue].cs

che conserva non solo il numero di parametri di tipo generico, ma anche i loro nomi specifici. Certo, non conserva le parentesi angolari, ma non possiamo avere tutto nella vita che vogliamo, possiamo?

    
risposta data 16.01.2015 - 01:51
fonte
4

Nel caso di Tuple e Action che Pete ha menzionato, Microsoft usa un singolo file - vedi Tuple.cs e Action.cs .

Penso che in parte dipenda dal fatto che la funzionalità di tutte le classi sia sostanzialmente la stessa. Personalmente non mi piace perdere le classi in un singolo file, ma questa potrebbe essere un'eccezione. Nel codice sorgente in cui lavoro ho aggiunto una classe NamedTuple autogenerata (usando T4) che agisce allo stesso modo di Tuple , ma con un nome stringa come primo argomento nel costruttore.

Per rispondere alla tua domanda, se non vuoi utilizzare un singolo file, forse usa MyClass_1.cs per MyClass<T1> , MyClass_2.cs per MyClass<T1, T2> , ecc.

Tuttavia, nessuna delle due opzioni è ideale, quindi sarei propenso a suggerire l'argomento "Microsoft come fare così, quindi ...".

    
risposta data 16.01.2015 - 01:54
fonte
0

Ti sei mai chiesto se le classi hanno davvero lo stesso intento? Se una classe è più generica dell'altra, allora sarà GenericClass , a MoreGenericClass e a MostGenericClass . Immagina che ogni parametro di tipo di una classe aggiunga una nuova dimensione alla classe, quindi potrebbe essere utile chiedere quale dimensione è.

Prendiamo questo esempio:

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

Sono consapevole che non è il miglior esempio, ma molto espressivo per mostrare tre dimensioni:

  • Dimensione interna, che cosa può caricare
  • dimensione metrica, con la quale può essere caricata la metrica, solo per il conteggio delle cose o per misura quadrata o per capacità cubica o per peso
  • Dimensione esterna, dove può essere caricato.

Quindi puoi modellare il trasporto di auto:

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

Trasporto di liquidi:

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

Trasporto di energia:

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

Trasporto di zucchero, cereali:

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

Oh, che sorpresa: un List<T> ha una dimensione che rappresenta le cose che la lista può contenere; e questo è un Map<T, S> con due dimensioni che rappresentano le cose che la mappa può contenere e le chiavi di accesso.

    
risposta data 16.01.2015 - 09:05
fonte

Leggi altre domande sui tag