70

クラスのバージョン2のようにgetterメソッドを変更するのは悪い習慣ですか。

バージョン1:

 public String getMyValue(){
     return this.myValue
 }

バージョン2:

 public String getMyValue(){

    if(this.myValue == null || this.myValue.isEmpty()){
       this.myValue = "N/A";
    }

    return this.myValue;
 }
4

14 に答える 14

117

getterメソッドがオブジェクトの内部状態を変更する場合、実際にはかなり悪い習慣だと思います。

同じことを達成するには、を返すことをお勧めし"N/A"ます。

  • 一般的に、この内部フィールドは、getterメソッドを使用する必要がない他の場所(内部)で使用される場合があります。したがって、最終的に、への呼び出しfoo.getMyValue()は実際にの動作を変更する可能性がありfooます。

nullまたは、からへの変換をセッター"N/A"で実行することもできます。つまり、内部値をifに設定することができます。"N/A"null


一般的な注意:コードに依存するAPIまたは他のインスタンスによって期待される場合
などの状態のみを追加します。"N/A"そうでない場合は、プログラミング言語で使用できる標準のnull型に依存する必要があります。

于 2012-12-14T09:51:52.750 に答える
38

私の意見では、あなたがしているのでない限りlazy-loading(その場合はそうではありません)、ゲッターは値を変更すべきではありません。だから私はどちらかだろう:

セッターに変更を入れます

public void setMyValue(String value) {
    if(value == null || value.isEmpty()){
        this.myValue = "N/A";
    } else {
        this.myValue = value;
    }
}

または、値が正しく設定されていない場合、ゲッターがデフォルト値を返すようにします。

public String getMyValue() {
    if(this.myvalue == null || this.myvalue.isEmpty()){
        return "N/A";
    }    
    return this.myValue;
}

遅延読み込みの場合、ゲッターでメンバーを変更するのは問題ないと思いますが、次のようにします。

public String getMyValue() {
    if (this.myvalue == null) {
        this.myvalue = loadMyValue();
    }    
    return this.myValue;
}
于 2012-12-14T09:50:26.173 に答える
11

いいえ。ここでは2つのことを行っています。取得と設定。

于 2012-12-14T14:53:27.393 に答える
10

はい。それは悪い習慣です。

なんで?

値が設定されている場合(コンストラクターまたはセッターメソッドで)、getterメソッドが呼び出されたときではなく、検証する必要があります。このためのメソッドを作成するprivate validate*ことも良い考えです。

private boolean validateThisValue(String a) {
     return this.myValue != null && !this.myValue.isEmpty();
}

public void setThisValue(String a) {
    if (validateThisValue(a)) {
        this.myValue = a;
    } 
    else {
        // do something else
        // in this example will be
        this.myValue = "N/A";
    }
}

また、getterメソッドでは、オブジェクトの状態を変更しないでください。私はいくつかのプロジェクトに取り組んできましたが、const「このメソッドは内部状態を変更できません」というゲッターを作成する必要があります。

少なくとも、物事を複雑にしたくない場合は、getterメソッドで、内部状態を変更してに設定するのではなく、戻る 必要があります。"N/A"myValue"N/A"

于 2012-12-14T10:04:48.567 に答える
6

私は通常、特定のを定義しますgetter

オリジナルを変更しないでくださいgetter

 public String getMyValue(){
     return this.myValue
 }

そして、特定のを作成しますgetter

public String getMyValueFormatted(){

    if(this.myvalue == null || this.myvalue.isEmpty()){
       return "N/A";
    }else{
       return this.myValue;
    }
 }
于 2012-12-14T17:48:11.063 に答える
5

を初期化する方が良いと思いますthis.myValue = "N/A"。そして、その後の呼び出しは、ビジネスの状況に応じてsetMyValue変更する必要があります。いかなる方法でも変更しないで ください。特定の値を返す必要がある場合は、変更せずにその値( "N / A"など)を返す必要があります。ゲッターはメンバーの値を変更してはなりません。this.myValue
getMyValuethis.myValuethis.myValue

于 2012-12-14T09:48:27.777 に答える
4

setterメソッド内でオブジェクトを変更するのではなく、getterメソッド内でオブジェクトを変更する必要がある理由を説明しない限り、これは悪い習慣だと思います。
なんらかの理由でこれができないと思いますか?詳しく教えていただけますか?

于 2012-12-14T10:11:10.143 に答える
4

絶対にそうです、それは悪い習慣です。

ネットワークを介してサードパーティ(リモーティング、COMなど)と通信すると、ラウンドトリップが増加し、アプリケーションのパフォーマンスが向上するとします。

于 2012-12-14T17:56:50.923 に答える
4

setterメソッドをより適切に変更して、値がnull空または空の場合、N/Aが属性に割り当てられるようにします。したがって、クラス内の他のメソッド(vg toString())で属性を使用すると、目的の値がそこにあります。

または、設定されている値が正しくない場合に例外を起動するようにsetterメソッドを変更します。これにより、プログラマーは値を設定する前に処理を改善する必要があります。

それ以外は大丈夫です。

于 2012-12-14T09:46:32.460 に答える
4

好きなことをしてください。結局のところ、ゲッターとセッターは単なる別のパブリックメソッドです。他の名前を使用することもできます。

ただし、のようなフレームワークを使用する場合Springは、これらの標準名を使用する必要があり、カスタムコードをその中に入れないでください。

于 2012-12-14T12:41:51.937 に答える
4

セッターは検証の一部として変更できますが、ゲッターは値を返し、呼び出し元が検証を実行できるようにする必要があります。検証する場合、どのように文書化する必要があります。

于 2012-12-15T01:58:06.823 に答える
3

これは実際には、get()メソッドで適用するコントラクトに大きく依存します。契約による設計の規則によれば、呼び出し元は前提条件が満たされていること(つまり、セッターメソッドで検証を行うことは実際には悪い設計であることが多い)と呼び出し先(それが正しい英語の用語であるかどうかはわかりません)を確認する必要があります。つまり、呼び出されたもの)は、事後条件が満たされていることを確認します。

get()メソッドがオブジェクトを変更できないようにコントラクトを定義すると、独自のコントラクトが破られます。次のようなメソッドの実装について考えてください

public isValid() {
    return (this.myvalue == null || this.myvalue.isEmpty());
}

このアプローチの利点は、get()の戻り値が「N/A」であるかどうかを確認する必要がないことです。これは、set()を呼び出す前に呼び出して、オブジェクトに不正な値を挿入していないことを検証することもできます。

デフォルト値を設定したい場合は、初期化中にそれを行う必要があります。

于 2012-12-14T16:14:16.303 に答える
3

ゲッターの状態変化は、ぶら下がっている犯罪であるべきです。つまり、クライアントコードは、ゲッターとセッターにアクセスする順序に注意する必要があります。これを行うには、実装に関する知識が必要です。ゲッターを任意の順序で呼び出すことができ、それでも同じ結果を得ることができるはずです。セッターがオブジェクトの現在の状態に応じて入力値を変更すると、関連する問題が発生します。

于 2013-11-21T10:26:10.797 に答える
2

この目的のためにいくつかの値ホルダーを使用できます。グアバライブラリのオプションクラスのように。

于 2012-12-14T09:45:16.457 に答える