Questo è probabilmente soggettivo, ma è una domanda interessante. Una classe in C ++ viene utilizzata per rappresentare diversi concetti distinti:
- Un'interfaccia
- Un oggetto
- Un tipo
Un'interfaccia coinvolgerà virtual void foo() = 0
e (si spera) nessuna implementazione. Un oggetto raggrupperà alcuni stati con alcuni metodi correlati, ad es. %codice%. Un tipo viene utilizzato per controllare il processo di compilazione, ma non ha uno scopo al di là di questo: potrebbe essere semplice come std::vector<int>
o struct tag;
.
Credo che se la classe e i metodi debbano essere suddivisi, dipende da quale delle categorie di cui sopra la stai usando. Un'interfaccia sposta tutto ciò che può nel file sorgente. È probabile che un oggetto sia una combinazione di piccoli metodi inline, scritti nell'intestazione e funzioni più grandi, forse con dipendenze, nella sorgente. Un tipo puro tende a essere coinvolto con i modelli e interamente nell'intestazione.
Tutto ciò detto, la maggior parte delle forme di "best practice" equivalgono a (compromessi tra) riducendo al minimo la duplicazione e minimizzando l'accoppiamento. Se applichiamo questi obiettivi alle classi, probabilmente vogliamo inserire qualsiasi metodo che estrae le dipendenze da altrove nel file di origine per ridurre al minimo l'accoppiamento e tutti gli altri nell'intestazione, quindi non è necessario digitare abbastanza. Scrivere una classe interamente in un file sorgente è grande fino a quando non è necessario condividerlo con altre unità di compilazione, ma fino ad allora, provaci.
Questo è complicato dai modelli. Se la classe in questione è basata su modelli, si è obbligati a scegliere tra la scrittura di gran parte di esso nell'intestazione o l'istanzializzazione esplicita per un set noto di tipi in un singolo file sorgente. Non posso difenderlo come best practice, ma tendo a scrivere classi di modelli interamente nei file di intestazione, calcolando il codice di tipo agnostico che esiste nelle funzioni libere.