it-swarm.it

Più classi in un singolo file .cs - buono o cattivo?

È consigliabile creare più classi all'interno di un file .cs o ogni file .cs deve avere una singola classe?

Per esempio:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Evitando per un minuto il fatto che questo è un cattivo esempio di buona architettura, avere più di una singola classe in un file .cs ha un odore di codice?

29
Sergio

L'esempio che hai dato in realtà va bene secondo me. Stai dichiarando classi interne, quindi è perfettamente sensato tenerli nello stesso file. L'unico modo per aggirare questo sarebbe rendere la tua classe Items una classe parziale e dividerla su più file. Considererei questa cattiva pratica. La mia politica generale per le classi nidificate è che dovrebbero essere piccole e private. Ci sono due eccezioni a questo:

  • stai progettando un cluster di classe (più comune in obiettivo-c), quindi potrebbe essere sensato utilizzare l'approccio di classe parziale
  • è necessario un enum che viene utilizzato solo con l'API pubblica della classe genitore. In questo caso preferisco avere un enum pubblico dichiarato all'interno della classe genitore invece di inquinare il mio spazio dei nomi. Essendo l'enum un "enum interno", si ottiene effettivamente un ambito ben definito.

Se pronunci la domanda in modo leggermente diverso e chiedi "Dovrei mettere ogni spazio dei nomi - classe di livello nel suo file", allora la mia risposta sarebbe "sì ".

Nel progettare le classi rispettiamo il principio di responsabilità singola. Leggere il codice diventa molto più semplice se la sua forma segue la sua semantica, quindi è ragionevole dividere i file per classe.

Da un punto di vista meccanico, avere un file per classe presenta diversi vantaggi. Puoi aprire più classi contemporaneamente in finestre diverse. Ciò è particolarmente importante poiché nessuno sviluppatore serio lavora con meno di due schermi. Essere in grado di avere più contesto in davanti della mia testa significa che posso mantenere più contesto in la mia testa. (La maggior parte degli IDE ti permetterà di aprire due volte lo stesso file, ma lo trovo imbarazzante).

Il prossimo aspetto importante è il controllo del codice sorgente e la fusione. Mantenendo le classi separate, si evitano molte seccature quando vengono apportate modifiche allo stesso file perché è necessario modificare classi separate.

30
Johannes Rudolph

Per essere brutalmente onesti, per favore non aggiungere più di una classe root a un file. Nel mio ultimo lavoro, c'erano file con non solo più classi, ma più spazi dei nomi e questo si estendeva in più migliaia di righe di codice. Molto difficile da provare a seguire.

Se sono presenti classi strettamente correlate, denominare i loro file in modo simile o inserirli in una sottocartella.

La separazione fisica dei file di classe aiuta (notate, non alla fine, tutti) a generare separazione delle preoccupazioni e un accoppiamento più lento.

D'altra parte, il tuo esempio non mostra più di una classe radice. Esistono diverse classi nidificate (nota: cerca di non creare classi nidificate se non private se riesci a progettarlo) e questo è perfettamente bene da avere in un file.

11
Jesse C. Slicer

In poche parole sì, non è una buona forma per farlo e ti dirò perché, un po 'più tardi quando la tua soluzione diventerà grande ti dimenticherai dove sono le classi poiché il nome del file non rappresenterà più quali sono i contenuti, qual è il nome del file AnimalPersonObject.cs non è fattibile.

Sicuramente puoi aggirare questo problema utilizzando le funzionalità di strumenti come resharper per passare ai tipi, ma 1 classe per file (comprese le interfacce) è davvero la spina dorsale di qualsiasi standard di codice che abbia mai visto, non solo in .net ma in Java e c ++ e molte altre lingue, quelle che spesso non hanno problemi di manutenzione e troverai sviluppatori minori che trovano difficile capire il codice.

Quasi tutti gli strumenti di ottimizzazione del codice ti diranno di spostare le classi in un file separato, quindi per me sì questo è un odore di codice e ha bisogno di un po 'di estro per neutralizzarlo :)

7
krystan honour

Se i file sono molto coerenti, ad esempio dove è un'alternativa ad avere molti file molto brevi, con nomi simili, allora può essere una buona idea.

Ad esempio, trovo che quando uso Fluent NHibernate è più facile se tengo Entity e EntityMap in un singolo file, nonostante ciò che i miei strumenti potrebbero dire al riguardo.

Nella maggior parte dei casi, rende le lezioni più difficili da trovare. Usare con parsimonia e con cautela.

7
mootinator

Un altro problema è che con classi molto grandi e simili nello stesso file - quando non puoi vedi la dichiarazione della classe in ogni momento - potresti finire per mettere i punti di interruzione nella classe sbagliata e chiederti perché non lo fanno vieni colpito ... grrr! :)

3
Julia Hayward