ゲッターとセッターを定義する順序は?[閉まっている]


12

ゲッターとセッターを定義する順序のベストプラクティスはありますか?2つのプラクティスがあるようです:

  • ゲッター/セッターペア
  • 最初にゲッター、次にセッター(またはその逆)

ここで違いを明らかにするために、ゲッター/セッターペアのJavaの例を示します。

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

次に、最初のゲッター、次にセッターのJavaの例を示します。

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

後者のタイプの順序付けは、コードとクラス図の両方でより明確であると思いますが、他のタイプの順序付けを除外するのに十分かどうかはわかりません。

回答:


7

最初の方法。可能な場合は、常にグループ化するか、同じメンバーを操作する関連関数によって近くに置いてください。

コードをこのように配置すると、リファクタリングがより明確かつ容易になります。1つのクラスを、あまりに多くの別のクラスからファクタリングできる場合、ファクタリング可能な部分は通常、特定のメンバー変数を中心に展開するからです。

一般に、オブジェクト/変数のライフサイクル全体を同じページに表示できると、コードのデバッグ、理解、操作が簡単になります。主に範囲やアルファベット順などの表面に基づいたコードレイアウトは、実際にはリファクタリングの機会を見逃してしまうため、リファクタリングの機会を逃すことになると言います。


同じメンバーで動作する関数をまとめておく必要がある理由について、さらに議論を加えたいですか?
NN

いくつかの理由を追加しました。
ベネディクト

25

チームに所属している場合は、彼らが通常行うことを行います。それ以外の場合は、もっと好きなものを選んでください。重要なデザインの選択肢の規模では、これはおそらく「スペースバーを押すためにどの親指を使用する必要がありますか」に近いでしょう。


7
完全に同意します。これは、#0みんなのコーディング標準ルールである必要があり、(それが「小さなもの悩む必要はありません」の見出しの下に来ている。ハーブサッターとアンドレ・アレキで「C ++コーディング規約」にルール#0)
デヴィッド・Hammen

スペースバーを打つためにどの親指を使うべきかについて多くの人が議論していると確信しています)))
superM

@Michael私も右腕です。左だけを使ってみましたが、非常に難しく、タイピングが遅くなりました。
axblount

@axblount私は右利きですが、常に左手の親指を使用します。ちょうど私の権利を試してみて、あなたが説明したのと同じ経験をした。また、何らかの理由で左手で「y」と入力します。
KChaloux

6

言語にも依存します。Javaにはどちらの順序にも本当の利点はありませんが、たとえばC#では、「プロパティ」の概念があり、ゲッターとセッターをグループ化するため、その順序を強制します。C ++のような言語では、ゲッターとセッター(たとえばプライベートセッター、パブリックゲッター)で異なる可視性が必要な場合があります。可視性修飾子は、それぞれに対してではなく、複数のメソッドに対して1回与えられるため。


4

私が知る限り、単一の慣習はありません。ファイル編成上のOracleのJavaコーディング規約のセクションには、明示的にゲッターとセッターの配置を言及していないが、それは言うん:

これらのメソッドは、スコープやアクセシビリティではなく機能ごとにグループ化する必要があります。

これはガイダンスを提供しません-どちらの配置もこの基準を満たしていると主張できます。

考慮すべき点は、最新のIDEを使用すると、テキストコードコンポーネントとしてよりもファイルの構造をより抽象的に表示できることです。これに強力な検索ツールを組み合わせると、ファイルを簡単にナビゲートし、大きなファイル内でも適切なメソッドを見つけることができます。

例として、Eclipseにはアウトラインビューが用意されており、メソッドとフィールドをさまざまな方法でソートおよびフィルターし、ファイル内の場所に直接移動できます。NetBeansには同様の機能がありましたが、他のほとんどのIDEにも同様の機能があると思います。

これが問題になるのは、IDEの外部でコードを読んでいる場合だけです。例としては、外部コードレビューツールの使用や、バージョン管理システムからのデルタの表示があります。

最善の解決策は、プロジェクト内のファイル間で単純に一貫性を保つことです。標準を見つけ、文書化し、それに固執します。


1

1つのフィールドのゲッターとセッターをペアでグループ化します。

すべてのゲッターとすべてのセッターを一緒にグループ化すると、どのフィールドにゲッターまたはセッターのみが含まれているかを判別するのが難しくなります。

コードを読んだり、特定の機能を探したりするとき、クラスにはフィールドがあり、各フィールドにはゲッターとセッターがあると想定しています。クラスにゲッターグループとセッターグループがあり、それぞれにフィールドがあるのは意味がありません。


だから、あなたの主張は、フィールドのゲッターはそのフィールドのゲッターとペアにする必要があるということです。クラスの特定のフィールドがどのように処理されるかを簡単に概観できるからです。
NN

それと、クラスとは何かの概念モデル。クラスは主に機能ごとに編成する必要があります。クラスを作成するときに、パブリックに表示される可変フィールドが必要であると判断する場合があります。これは概念的な「機能」であり、getterおよびsetterメソッドによる構文表現ではありません。
M.ダドリー

0

これまでのJava IDEは、ゲッターとセッターを生成できます。その機能を使用し、IDEが作成したようなメソッドの順序をそのままにしてください。これは生成されたコードであり、不必要に触れないでください。


私はこれを知っています。ただし、たとえばEclipseでは、異なる順序から選択できます
NN

正しい。デフォルトのオプションの「ゲッター/セッターペアのフィールド」は、どちらのメソッドがどこに行くかを心配せずにフィールドを追加し、アクセサーを後で生成できるため、両方が最後にあるため、より便利に思えます。
-user281377
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.