2010-04-09 3 views
11

Sto scrivendo un paio di classi che hanno tutti argomenti di tipo generico, ma ho bisogno di sovraccaricare le classi perché ho bisogno di un numero diverso di argomenti in scenari diversi. Fondamentalmente, hoCome dovrei denominare i miei file con definizioni di classi generiche?

public class MyGenericClass<T> { ... } 
public class MyGenericClass<T, K> { ... } 
public class MyGenericClass<T, K, L> { ... } 
// it could go on forever, but it won't... 

li voglio tutti nello stesso spazio dei nomi, ma in un file sorgente per classe. Come dovrei nominare i file? Esiste una buona pratica?

+2

Non pensavo che fosse nemmeno possibile creare classi diverse con lo stesso nome ma un diverso numero di argomenti generici. EDIT: oops, questo è C#, non Java. Dubito che potresti farlo in Java, per via del modo divertente in cui deve gestire le classi generiche. –

+0

Microsoft non fa proprio questo con la classe 'Tuple' in 4.0? –

+0

Vedi, per esempio, Tuple - Rappresenta una tupla di taglia 1 Tuple - Rappresenta una tupla di dimensioni 2 Tuple - Rappresenta una tupla di dimensioni 3 – JasonTrue

risposta

9

persone che ho visto usano

MyGenericClass`1, MyGenericClass`2 or MyGenericClass`3 

(il numero è il numero di parametri generici).

Penso che sia quello che si ottiene come TypeName quando si chiama .ToString sulla classe.

+1

Anche i documenti XML usano questo e le definizioni IOC –

+3

L'argomento '.ToString()' è di gran lunga il migliore che ho visto nelle discussioni su questo finora. A meno che non si verifichi qualcosa di distruttivo nel prossimo giorno o giù di lì, questo è probabilmente quello che farò. –

+0

concordato. Questo è ciò che emerge anche nei risultati della copertura del codice. –

1

Penso che non troverete molto dogma nella comunità C# che privilegia file separati per ogni variante di una classe generica con lo stesso nome; Preferisco semplicemente usarne uno per il caso che stai descrivendo, anche se potrei vedere un caso per quello che stai proponendo se il codice è necessariamente complesso/lungo per ogni variazione. Generalmente utilizzerei semplicemente il nome della classe in questione come nome file.

Se dovessi separare le varianti in file separati, potrei vedere usando la soluzione di Michael, anche se sarebbe un po 'doloroso per quelli di noi che usano strumenti in stile Unix sulla riga di comando, per esempio, Cygwin o AndLinux. Probabilmente userò un trattino basso o nessuna punteggiatura. O qualcosa come 1P, 2P, 3P come suffisso.

1

Li inserisco tutti nello stesso file a meno che non siano grandi (che di solito non saranno, tranne quello con il maggior numero di Ts).

Non esiste una procedura ottimale per denominare le classi oltre a ciò che si trova nelle linee guida di .NET Framework, poiché fa parte del lato creativo della programmazione e, purtroppo, SSCLI torna solo alla 2.0, quindi non è possibile trovare molto aiuto lì.

1

Io di solito uso Classname.1.cs, Classname.2.cs, ecc ... dove il numero è il numero di argomenti generici, simile al `` 1 notation used in the framework documentation (and in XML documentation in your sourcecode). Sometimes you also have a class with no generic arguments (similar to ICollection and ICollection` nel quadro), e il nome del file sarebbe solo il nome della classe , come previsto. A differenza dell'utilizzo di un apice, questo ha il vantaggio che non si avranno caratteri non validi nel nome file. Non tutti i filesystem, i sistemi di controllo delle versioni, i sistemi operativi consentono un carattere retrospettivo nel nome.

2

Quando questa situazione si verifica adotto la stessa convenzione che viene utilizzato nei commenti di documentazione XML per C# generici, che è quello di utilizzare { e } invece di < e > perché parentesi angolari non sono amichevoli in entrambi i nomi XML o di file ma quelli ricci sono. Quindi, qualcosa di simile a:

MyClass {T} cs

MyClass {T, K} cs

Se avete davvero molto numerosi parametri, però, questo può ottenere un po 'ingombrante come schema di denominazione, quindi tenderei ad adottare la convenzione CLR di backtick seguita dal conteggio dei parametri, ad es

MyClass`1.cs

MyClass`2.cs

o mescolare e abbinare i due schemi a seconda della situazione.