Il codice in un file di intestazione descrive un'interfaccia - i tipi e le funzioni che la tua unità di compilazione espone. Tutto ciò che è necessario per descrivere questa interfaccia dovrebbe essere nell'intestazione. I dettagli di implementazione non appartengono all'intestazione, perché i dettagli dell'implementazione non fanno parte dell'interfaccia.
Quindi, se l'implementazione di queste funzioni è parte del loro contratto pubblico (necessariamente per i modelli), quindi sicuro, lasciatele nell'intestazione. Se una funzione è così banale che esiste una sola possibile implementazione e vuoi che sia in linea, vai avanti. Un esempio potrebbe essere un metodo getter di un oggetto che restituisce solo un campo privato.
Ma nella maggior parte dei casi, anche le funzioni semplici dovrebbero essere mantenute nel file .cpp. Questa è davvero una struttura migliore per il tuo codice e, come bonus aggiuntivo, migliora i tempi di compilazione.
In effetti, le intestazioni spesso includono troppi dettagli di implementazione. Ci sono strategie come l'idioma pimpl per evitare di rendere troppi dettagli (come i membri privati) esternamente visibili. Questo è estremamente importante in una libreria che deve mantenere un'interfaccia binaria specifica, un po 'meno in un'applicazione. In ogni caso, mantenere i file di intestazione minimi è più conveniente e utile.
Se vuoi assicurarti che una funzione scritta una volta non cambi il suo comportamento, la soluzione corretta non è di impedirne la modifica. Invece, scrivi test unitari per garantire le proprietà del comportamento che ti interessa. Quando qualcuno rimuove le funzioni o modifica il suo comportamento in modo incompatibile, il test si interromperà e ti avviserà di questo problema. Nessuno può ricordare che cosa dovrebbe fare esattamente ogni parte della tua base di codice, quindi annotare e automatizzare questa conoscenza con una suite di test unitari è un ottimo modo per prevenire errori costosi in seguito.
Vorrei anche sottolineare che stai cercando di risolvere un problema di persone (altri programmatori potrebbero rompere accidentalmente il codice modificando questa funzione) nascondendo il problema (inseriamo il codice dove nessuno lo vede). Questo non risolve il tuo problema, lo mescola solo in giro. Una soluzione migliore è parlare con il team in modo da poter raggiungere un consenso (siamo d'accordo che alcune funzioni non devono essere modificate) e concordare una soluzione comune come parte delle convenzioni di codifica (ad esempio "metodi stabili che non dovrebbero essere modificati con un commento // stable - do not change
").