In alcuni linguaggi di programmazione, l'ordine è importante perché non puoi utilizzare le cose fino a dopo che sono state dichiarate. Ma a parte questo, per la maggior parte delle lingue non ha importanza per il compilatore. Quindi, ti rimane che conta per gli umani.
La mia citazione preferita di Martin Fowler è: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
Quindi direi che l'ordine della tua classe dovrebbe dipendere da ciò che rende facile per gli umani capire.
Personalmente preferisco il trattamento step-down che Bob Martin dà nel suo libro Clean Code
. Le variabili membro nella parte superiore della classe, quindi i costruttori, quindi tutti gli altri metodi. E tu ordini i metodi per essere vicini insieme a come sono usati all'interno della classe (piuttosto che mettere tutto in modo pubblico poi privato e poi protetto). La chiama minimizzando la "distanza verticale" o qualcosa del genere (non avere il libro su di me al momento).
Modifica
L'idea di base della "distanza verticale" è che vuoi evitare di far saltare le persone attorno al tuo codice sorgente solo per capirlo. Se le cose sono collegate, dovrebbero essere più vicine. Le cose non correlate possono essere più distanti.
Il capitolo 5 di Pulisci codice (ottimo libro, btw) entra in una tonnellata di dettagli su come Mr. Martin suggerisce di ordinare il codice. Suggerisce che il codice di lettura dovrebbe funzionare come leggere un articolo di giornale: i dettagli di alto livello vengono prima (in alto) e ottieni maggiori dettagli mentre leggi. Dice: "Se una funzione chiama un'altra, dovrebbero essere chiuse verticalmente e il chiamante dovrebbe essere al di sopra della chiamata, se possibile." Inoltre, i concetti correlati dovrebbero essere vicini.
Ecco un esempio forzato che non funziona in molti modi (scarsa progettazione OO, mai usare double
per soldi) ma illustra l'idea:
public class Employee {
...
public String getEmployeeId() { return employeeId; }
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public double calculatePaycheck() {
double pay = getSalary() / PAY_PERIODS_PER_YEAR;
if (isEligibleForBonus()) {
pay += calculateBonus();
}
return pay;
}
private double getSalary() { ... }
private boolean isEligibleForBonus() {
return (isFullTimeEmployee() && didCompleteBonusObjectives());
}
public boolean isFullTimeEmployee() { ... }
private boolean didCompleteBonusObjectives() { ... }
private double calculateBonus() { ... }
}
I metodi sono ordinati in modo che siano vicini a quelli che li chiamano, procedendo dall'alto verso il basso. Se avessimo messo tutti i metodi private
al di sotto di public
, allora dovresti fare ancora un salto per seguire il flusso del programma.
getFirstName
e getLastName
sono concettualmente correlati (e getEmployeeId
probabilmente lo è anche), quindi sono vicini. Potremmo spostarli tutti verso il basso, ma non vorremmo vedere getFirstName
nella parte superiore e getLastName
nella parte inferiore.
Speriamo che questo ti dia l'idea di base. Se ti interessa questo tipo di cose, ti consiglio vivamente di leggere Clean Code
.