W niektórych językach programowania kolejność ma znaczenie, ponieważ nie można używać rzeczy, dopóki nie zostaną zadeklarowane. Ale z wyjątkiem tego, w większości języków nie ma to znaczenia dla kompilatora. Zatem pozostaje ci to ważne dla ludzi.
Mój ulubiony cytat Martina Fowlera to: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
Powiedziałbym, że porządek w twojej klasie powinien zależeć od tego, co ułatwia ludziom zrozumienie.
Osobiście wolę łagodniejsze traktowanie, które Bob Martin podaje w swojej Clean Code
książce. Zmienne składowe na początku klasy, następnie konstruktory, a następnie wszystkie inne metody. I zamawiasz metody, aby były blisko siebie i jak są używane w klasie (zamiast arbitralnie umieszczać wszystkie publiczne, a następnie prywatne, a następnie chronione). Nazywa to minimalizowaniem „odległości w pionie” lub coś w tym rodzaju (w tej chwili nie mam przy sobie książki).
Edytować:
Podstawową ideą „odległości w pionie” jest to, że chcesz uniknąć skakania wokół kodu źródłowego, aby go zrozumieć. Jeśli rzeczy są powiązane, powinny być bliżej siebie. Niepowiązane rzeczy mogą być dalej od siebie.
Rozdział 5 Czystego kodu (świetna książka, btw) zawiera mnóstwo szczegółów na temat tego, jak Pan Martin sugeruje zamówienie kodu. Sugeruje, że czytanie kodu powinno działać tak, jak czytanie artykułu z gazety: na pierwszym miejscu są szczegóły wysokiego poziomu (u góry), a podczas czytania pojawia się więcej szczegółów. Mówi: „Jeśli jedna funkcja wywołuje inną, powinny one być pionowo zamknięte, a osoba dzwoniąca powinna znajdować się powyżej rozmówcy, jeśli to w ogóle możliwe”. Ponadto powiązane pojęcia powinny być blisko siebie.
Oto wymyślony przykład, który jest zły na wiele sposobów (zły projekt OO; nigdy nie używaj double
pieniędzy), ale ilustruje ideę:
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() { ... }
}
Metody są uporządkowane, aby były zbliżone do tych, które je wywołują, schodząc z góry. Gdybyśmy umieścili wszystkie private
metody poniżej public
tych, musiałbyś robić więcej skoków, aby śledzić przebieg programu.
getFirstName
i getLastName
są ze sobą powiązane (i getEmployeeId
prawdopodobnie też są), więc są blisko siebie. Moglibyśmy przenieść je wszystkie na dół, ale nie chcielibyśmy widzieć getFirstName
na górze i getLastName
na dole.
Mam nadzieję, że daje to podstawowy pomysł. Jeśli jesteś zainteresowany tego typu rzeczami, zdecydowanie polecam lekturę Clean Code
.