In alcuni linguaggi di programmazione, l'ordine è importante perché non è possibile utilizzare le cose fino a quando non sono state dichiarate. Ma a parte questo, per la maggior parte delle lingue non importa al compilatore. Quindi, sei rimasto con ciò 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'ordinamento della tua classe dovrebbe dipendere da ciò che rende facile per gli umani capire.
Personalmente preferisco il trattamento dimensionale che Bob Martin dà nel suo Clean Code
libro. Le variabili membro nella parte superiore della classe, quindi i costruttori, quindi tutti gli altri metodi. E ordinate che i metodi siano vicini a come vengono usati all'interno della classe (piuttosto che mettere arbitrariamente tutto il pubblico, poi il privato, quindi il protetto). Lo chiama minimizzando la "distanza verticale" o qualcosa del genere (non avere il libro su di me al momento).
Modificare:
L'idea di base della "distanza verticale" è che vuoi evitare di far saltare le persone intorno al tuo codice sorgente solo per capirlo. Se le cose sono correlate, dovrebbero essere più vicine tra loro. Le cose non correlate possono essere più distanti.
Il capitolo 5 di Clean Code (ottimo libro, a proposito) spiega in dettaglio come il signor Martin suggerisce di ordinare il codice. Suggerisce che leggere il codice dovrebbe funzionare in qualche modo come leggere un articolo di giornale: i dettagli di alto livello vengono prima di tutto (in alto) e ottieni maggiori dettagli mentre leggi. Dice "Se una funzione chiama un'altra, dovrebbero essere vicini verticalmente e il chiamante dovrebbe essere al di sopra della chiamata, se possibile". Inoltre, i concetti correlati dovrebbero essere vicini.
Quindi ecco un esempio inventato che è male in molti modi (cattivo design OO; non usare mai 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, scendendo dall'alto. Se avessimo messo tutti i private
metodi al di sotto di public
quelli, allora dovresti fare di più saltando in giro per seguire il flusso del programma.
getFirstName
e getLastName
sono concettualmente correlati (e getEmployeeId
probabilmente lo è anche), quindi sono vicini tra loro. Potremmo spostarli tutti verso il basso, ma non vorremmo vedere getFirstName
in alto e getLastName
in basso.
Spero che questo ti dia l'idea di base. Se sei interessato a questo genere di cose, ti consiglio vivamente di leggere Clean Code
.