一部のプログラミング言語では、宣言されるまで物を利用できないため、順序が重要です。しかし、それを除けば、ほとんどの言語ではコンパイラにとって重要ではありません。だから、あなたはそれが人間にとって重要なままになっています。
私のお気に入りのマーティン・ファウラーの引用は次のとおりです。Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
したがって、クラスの順序は、人間が理解しやすいものに依存するべきだと思います。
私は個人的に、ボブ・マーティンが彼のClean Code
本で与えているステップダウン治療を好みます。クラスの最上位にあるメンバー変数、コンストラクター、その他すべてのメソッド。そして、メソッドをクラス内でどのように使用されるかによって近くなるように順序付けます(すべてのパブリック、プライベート、そして保護を任意に配置するのではなく)。彼はそれを「垂直距離」またはそのようなものを最小化すると呼びます(現時点では私に本を持っていません)。
編集:
「垂直距離」の基本的な考え方は、ソースコードを理解するためだけにソースコードの周りを人々が飛び回るのを避けることです。物事が関連している場合、それらはより密接でなければなりません。無関係なものはさらに離れている可能性があります。
Clean Codeの第5章 (素晴らしい本、ところで)は、Martin氏が注文コードをどのように提案するかについて、非常に詳細に説明しています。彼は、コードを読むことは新聞記事を読むようなものであるべきだと提案している:高レベルの詳細が最初に(上部に)来て、あなたが読むほど詳細が得られる。「ある関数が別の関数を呼び出す場合、関数は垂直方向に近く、呼び出し元は可能な限り呼び出し先の上にいる必要があります」と言います。さらに、関連する概念は密接に関連している必要があります。
だから、多くの点で悪い(オブジェクト指向設計が不十分で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
。