Come modello ideale uso i seguenti criteri (con una logica simile a quella suggerita da Martin Beckett, cioè pensare in termini di struttura logica e non in termini di linee di codice):
Regola 1
Una classe per file (in C ++: una classe - > un'intestazione e un file di implementazione).
Regola 2
Sette è considerato il numero di oggetti che il nostro cervello può osservare nello stesso tempo senza confondersi. Sopra 7 abbiamo difficoltà a mantenere una visione d'insieme di ciò che vediamo. Pertanto: ogni classe non dovrebbe avere più di 7-10 metodi. Una classe che ha più di 10 metodi è probabilmente troppo complessa e dovresti provare a dividerla. La divisione è un metodo molto efficace perché ogni volta che dividi una classe riduci la complessità di ogni singola classe almeno di un fattore 2.
Regola 3
Un corpo del metodo che non rientra in uno o due schermi è troppo grande (presumo che una finestra di schermo / editor sia di circa 50 righe). Idealmente, puoi vedere l'intero metodo in una finestra. Se questo non è il caso, devi solo scorrere verso l'alto e verso il basso un po ', senza dimenticare la parte del metodo che viene nascosta. Quindi, se devi scorrere più di una schermata verso l'alto o verso il basso per leggere l'intero corpo del metodo, il tuo metodo è probabilmente troppo grande e puoi facilmente perdere la panoramica.
Anche in questo caso, suddividere i metodi usando metodi di guida privati può ridurre la complessità del metodo molto velocemente (ad ogni scissione la complessità è almeno dimezzata). Se introduci troppi metodi di aiuto privati, puoi considerare di creare una classe separata per raccoglierli (se hai metodi più privati di quelli pubblici, forse una seconda classe si nasconde nella tua classe principale).
Mettere insieme queste stime molto approssimative:
- Al massimo una classe per file sorgente.
- Al massimo 10 metodi pubblici per classe.
- Al massimo 10 metodi privati per classe.
- Al massimo 100 righe per metodo.
Quindi un file sorgente di oltre 2000 righe è probabilmente troppo grande e inizia a essere troppo disordinato.
Questa è davvero una stima molto approssimativa e non seguo sistematicamente questi criteri (soprattutto perché non c'è sempre abbastanza tempo per fare un corretto refactoring). Inoltre, come suggeriva Martin Beckett, ci sono situazioni in cui una classe è una vasta collezione di metodi e non ha senso dividerli in qualche modo artificiale solo per rendere la classe più piccola.
In ogni caso, nella mia esperienza un file inizia a diventare illeggibile quando uno dei parametri di cui sopra non viene rispettato (ad esempio un corpo di metodo di 300 linee che si estende su sei schermi o un file sorgente con 5000 linee di codice).