В некоторых языках программирования порядок имеет значение, потому что вы не можете использовать вещи до тех пор, пока они не будут объявлены. Но, за исключением этого, для большинства языков это не имеет значения для компилятора. Итак, вы остались с этим важно для людей.
Моя любимая цитата Мартина Фаулера такова: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
так что я бы сказал, что порядок в вашем классе должен зависеть от того, что облегчает людям понимание.
Я лично предпочитаю постепенное обращение, которое Боб Мартин дает в своей Clean Code
книге. Переменные-члены в начале класса, затем конструкторы, а затем все остальные методы. И вы приказываете, чтобы методы были близки к тому, как они используются в классе (вместо того, чтобы произвольно выставлять все общедоступные, а затем закрытые, а затем защищенные). Он называет это минимизацией «вертикального расстояния» или чего-то в этом роде (на данный момент у меня нет книги).
Редактировать:
Основная идея «вертикального расстояния» заключается в том, что вы хотите не заставлять людей прыгать вокруг вашего исходного кода просто для того, чтобы понять его. Если вещи связаны, они должны быть ближе друг к другу. Несвязанные вещи могут быть дальше друг от друга.
Глава 5 Чистого кода (отличная книга, кстати) подробно описывает, как мистер Мартин предлагает заказывать код. Он предлагает, чтобы чтение кода работало так же, как чтение газетной статьи: подробности высокого уровня идут первыми (вверху), и вы получаете больше деталей, когда читаете. Он говорит: «Если одна функция вызывает другую, они должны быть расположены вертикально, а вызывающая сторона должна быть выше вызываемой, если это вообще возможно». Кроме того, связанные понятия должны быть близко друг к другу.
Итак, вот надуманный пример, который во многих отношениях плох (плохой дизайн ОО; никогда не используется double
за деньги), но иллюстрирует идею:
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() { ... }
}
Методы упорядочены таким образом, что они близки к тем, которые их вызывают, работая сверху вниз. Если бы мы поместили все private
методы ниже public
тех, которые вам нужны, вам пришлось бы больше прыгать, чтобы следить за ходом программы.
getFirstName
и getLastName
концептуально связаны (и, getEmployeeId
вероятно, тоже), поэтому они близки друг к другу. Мы могли бы переместить их всех вниз, но мы не хотели бы видеть getFirstName
сверху и getLastName
снизу.
Надеюсь, это даст вам основную идею. Если вы заинтересованы в таких вещах, я настоятельно рекомендую прочитать Clean Code
.