Em algumas linguagens de programação, a ordem importa porque você não pode utilizar as coisas até que elas tenham sido declaradas. Mas, exceto para a maioria dos idiomas, isso não importa para o compilador. Então, você fica com isso importando para os humanos.
Minha citação favorita de Martin Fowler é: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
Então, eu diria que a ordem de sua classe deve depender do que facilita a compreensão pelos seres humanos.
Pessoalmente, prefiro o tratamento que Bob Martin dá em seu Clean Code
livro. Variáveis de membro na parte superior da classe, construtores e todos os outros métodos. E você ordena que os métodos sejam próximos da maneira como são usados na classe (em vez de colocar arbitrariamente todo público, depois privado e depois protegido). Ele chama isso de minimizar a "distância vertical" ou algo assim (não tenho o livro comigo no momento).
Editar:
A idéia básica da "distância vertical" é que você deseja evitar que as pessoas pulem ao redor do seu código-fonte apenas para entendê-lo. Se as coisas estiverem relacionadas, elas devem estar mais próximas. Coisas não relacionadas podem estar mais afastadas.
O Capítulo 5 do Código Limpo (ótimo livro, btw) entra em vários detalhes sobre como o Sr. Martin sugere o pedido de código. Ele sugere que a leitura do código funcione como a leitura de um artigo de jornal: os detalhes de alto nível vêm primeiro (na parte superior) e você obtém mais detalhes à medida que lê. Ele diz: "Se uma função chama outra, elas devem estar verticalmente próximas e o chamador deve estar acima do chamado, se possível". Além disso, os conceitos relacionados devem estar próximos.
Então, aqui está um exemplo artificial que é ruim de várias maneiras (design pobre de OO; nunca use double
por dinheiro), mas ilustra a idéia:
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() { ... }
}
Os métodos são ordenados para que sejam próximos aos que os chamam, descendo de cima para baixo. Se tivéssemos colocado todos os private
métodos abaixo public
desses, você teria que fazer mais pulos para seguir o fluxo do programa.
getFirstName
e getLastName
são conceitualmente relacionados (e getEmployeeId
provavelmente também), por isso estão próximos. Poderíamos movê-los todos para o fundo, mas não gostaríamos de ver de getFirstName
cima e de getLastName
baixo.
Espero que isso lhe dê a idéia básica. Se você está interessado nesse tipo de coisa, recomendo fortemente a leitura Clean Code
.