4

セッターの引数を変更するのは普通ですか? setString メソッドがあるとします。そして、文字列のトリミングされた形式を維持したいのです。したがって、末尾にスペースがある文字列は無効ですが、例外をスローしたくはありません。

最善の解決策は何ですか? たとえば、セッターの値をトリムするには

public void setString(String string) {
    this.string = string.trim();
}

または、呼び出し元で(複数回)トリムします。

object.setString(string.trim());

それとも何か他のものですか?

4

9 に答える 9

10

はい。結局のところ、セッターはこの種のもののために設計されています! フィールドに書き込まれた値を制御およびサニタイズするため;)

于 2009-01-11T20:57:11.983 に答える
1

完全に。次に例を示します。さまざまなタイプの測定単位を使用したエンジニアリングプログラムがあるとします。1つの測定システムで内部値を保持しますが、セッターで他のすべての値から変換し、ゲッターで変換し直します。例:

public double UserTemperature
{
  get
  {
    return Units.Instance.ConvertFromSystem(UnitType.Temperature, temperature);
  }
  set  
  {
    double v = Units.Instance.ConvertToSystem(UnitType.Temperature, value);
    if (temperature != v)
    {
      temperature = v;
      Changed("SystemTemperature");
      Changed("UserTemperature");
    }
  }
}
于 2009-01-11T21:23:09.467 に答える
0

一見、驚き最小の原則に違反しているように見えます。私があなたのクラスのユーザーである場合、セッターが私が指示したとおりに実行することを期待します。セッターで例外をスローして、ユーザーに入力のトリミングを強制します。

もう1つの(より良い?)代替手段は、メソッドの名前をtrimAndSetStringに変更することです。そうすれば、入力をトリミングすることは驚くべきことではありません。

于 2009-01-11T21:25:12.397 に答える
0

私が間違っている場合は訂正してください。しかし、セッターがこの種のロジックを保持する必要があることは私には論理的に見えます。セッターがチェックせずに内部変数に値を割り当てているだけの場合は、変数自体を公開してみませんか?

于 2009-01-11T21:33:32.143 に答える
0

はい、そうです。メソッド (trim() など) を適用する前に、NULL をチェックするように注意してください。

于 2009-01-11T21:03:24.593 に答える
0

人によって哲学は異なりますが、プロパティ セッターは、指定された値に一致するようにオブジェクトの状態の側面を設定し、変更を気にする人に通知する可能性がある場合にのみ適切であることをお勧めしますが、それ以外の場合は変更に影響を与えません。オブジェクトの状態 (プロパティ セッターに関連付けられた状態の観点からプロパティが定義されている場合、プロパティ セッターが読み取り専用プロパティの値を変更することは完全に適切です。たとえば、コントロールの読み取り専用Rightプロパティは、その条件Bounds)。指定された操作を実行できない場合、プロパティ セッターは例外をスローする必要があります。

上記の説明を満たさない何らかの方法でクライアントがオブジェクトの状態を変更できるようにしたい場合は、プロパティではなくメソッドを使用する必要があります。呼び出した場合Foo.SetAngle(500)、メソッドが角度の設定に示されたパラメーターを使用することが合理的に期待されますが、Angleプロパティは設定されたのと同じ形式で角度を返さない場合があります (たとえば、140 を返す場合があります)。一方、Angleが読み書き可能なプロパティである場合、値 500 の書き込みが禁止されるか、値が 500 に読み戻されることが予想されます。 オブジェクトに角度を範囲内に保存させたい場合0 から 359 の範囲で、オブジェクトBaseAngleは常にその形式で角度を返す読み取り専用プロパティを呼び出すこともできます。

于 2013-03-05T18:21:24.273 に答える
0

これがまさに、オブジェクト フィールドを広い世界全体に公開するのではなく、セッターを使用する理由です。

0 から 359 までの整数の角度を保持するクラスを考えてみましょう。

フィールドを公開すると、関数を呼び出すことで必要に応じてフィールドを設定でき、API で指定されたコントラクトが破られます。また、コードがその変数の特定の範囲を想定して記述されているため、機能が途中で壊れる可能性もあります。

セッターを使用すると、さまざまなことができます。1 つは、無効な値が渡されたことを示すために例外を発生させることですが、それは私の見解では正しくありません (この場合)。次のように、入力値を 0 から 359 の間の値に変更すると、より便利になる可能性があります。

actualVal = passedValue % 360;

これがインターフェイス (API) で指定されている限り、完全に有効です。実際、指定しなくても、呼び出し元が (範囲外の値を渡すことによって) コントラクトに違反しているため、自由に好きなことを行うことができます。私は「できるだけ早く入力をサニタイズする」というルールに従う傾向があります。

特定のケースでは、文字列がトリミングされた形式で保存されることを指定している限り、発信者が文句を言う理由はありません (そのような文字列は無効であると既に述べています)。セッターを呼び出すすべてのコードで行うよりも、セッターで実行する方が、コード サイズ (速度ではなく) の点で優れています。また、文字列が期待どおりに格納されることも保証します。呼び出し元がトリミングされていない文字列を誤って (または意図的に) 格納しないという保証はありません。

于 2009-01-11T22:50:12.893 に答える