15

Java では、クラス変数をシャドウするケースが一般的です。Eclipse は問題なく次のコードを生成します。

public class TestClass {
    private int value;
    private String test;
    public TestClass(int value, String test) {
        super();
        this.value = value;
        this.test = test;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public String getTest() {
        return test;
    }
    public void setTest(String test) {
        this.test = test;
    }
}

可変シャドウイングは問題ありませんか?

「シャドウイングは禁止」というコーディングルールの導入を検討しています。上記の単純なケースでは、何が起こっているかは明らかです。何かを行うコードをもう少し追加すると、"this" が失われ、バグが発生するリスクがあります。

一般的なコンセンサスは何ですか?シャドーイングを禁止するか、ときどき許可するか、そのままにするか。

4

10 に答える 10

21

私は実際には、「シャドウイングはコンストラクターとセッターでのみ許可されています」というガイドラインを好みます。他のすべては許可されていません。
コンストラクターの引数に名前を付ける手間を省き、aValueシャドウaTestイングを回避します。

Eclipseを使用している場合、その警告設定はそのオプションBTWに正確に設定できます。

于 2010-02-16T07:18:45.797 に答える
3

ローカル変数とは異なる色でフィールドを強調表示し、ローカル変数の誤用に関する有用な警告を提供する Eclipse や IntelliJ IDEA などの IDE を使用する場合、変数のシャドウイングは安全だと感じています。

于 2010-02-16T07:22:07.007 に答える
3

シャドウイングは、コンストラクター getter セッターなどの単純なコードで役立ちます。

ただし、記述変数の使用は非常に重要であるため、これを使用する代わりに

this.name = name;これを試してthis.name = newName;

また、コードに含めることを習慣にすると、this.それは第二の性質になり、読みやすさにかなり役立ちます

于 2010-02-16T07:25:27.717 に答える
2

Eclipse のような優れた IDE は、さまざまな色やフォントで、クラスの属性とメソッド変数を表示します。そのため、変数のシャドウイングは問題ありません。

于 2010-02-16T07:22:34.697 に答える
1

スタイル ルールの主な理由は、元の作成者とそれを維持する必要がある他のユーザーの両方にとって、コードを読みやすくすることです。このコンテキストでは、可読性とは、メカニズム レベルとより深いセマンティック レベルの両方で、コードが実際に何を行っているかを簡単に理解できることです。

一般に、(コンストラクターとセッターを除いて) 変数の非表示は悪いスタイルと見なされる傾向があります。これは、カジュアルな読者がローカルの使用をメンバーの使用と間違えたり、その逆の場合があるためです。(メンバー名を強調表示する IDE はこれを軽減する傾向がありますが、それでも区別を見落としがちです。) また、(コンストラクターとセッターを除いて) 一般に、ローカルと同じ名前のメンバーの間には明確な意味上の違いがあります。これは、異なる名前を使用することで最もよく反映されます。

セッターとコンストラクターは、上記の各点で少し異なります。セッター (特に) とコンストラクターは単純で様式化されているため、表示されているフォームを非表示にしても、カジュアルな読者や混乱を引き起こす可能性は低いです。実際、本質的に同じ情報に対して 1 つの識別子のみを使用すると、実際にはコードが読みやすくなる可能性があると私は主張します。

これに基づいて、コンストラクターとセッターに隠すことは完全に受け入れられると思います。このコンテキストで非表示にすることを避けるべきだと固く主張するスタイル ルールは、(IMO) 衒学的であり、非生産的である可能性があります。そして、ほとんどの Java コーダーが通常のやり方と考えていることとは、明らかに歩調を合わせていません。

于 2010-02-16T11:01:19.563 に答える
1

私は実際に Eclipse のインストールをセットアップして、修飾されていないすべての変数に対して警告を発行しました。これにより、実装変数の前にthis.. これにより、シャドウイングから発生する可能性のある問題が効果的に先制的に解決されました。

これは、[設定] > [Java] > [コンパイラ] > [エラー/警告] > [コード スタイル] > [インスタンス フィールドへの非修飾アクセス] で実行できます。

于 2010-02-16T07:25:27.693 に答える
1

私はいつも「これ」のシャドーイングをしています。複雑な場所では、this何もシャドウしない場合でも明示的に使用すると便利です。これにより、人間の観点から、ローカル変数とクラス変数を簡単に区別できます (ただし、一貫性を保つ必要があるという問題が生じます。thisあちこちで少しずつ使用しても、どこでも混乱するわけではありません)。

Python では、選択肢さえありません。plainxは常にローカルです。クラスのメンバーはself.x.

于 2010-02-16T07:28:42.383 に答える
0

さて、このコードに問題はありません。IDE が、記述しなければならないコードの量を減らすのに役立っているのは良いことです。

于 2010-02-16T07:35:02.440 に答える
0

有効なケースは、それが明確な署名を提供することです。そのため、アプリを維持している人は、どのフィールドが Call で渡されたかを簡単に確認できます。

ただし、Builder パターンは、保守性のためのより優れたソリューションです。

于 2010-02-16T08:08:19.667 に答える