web-dev-qa-db-ja.com

設定のみのプロパティを持つことが推奨されないのはなぜですか?

今日、職場の同僚が私のコードをレビューし、設定のみのプロパティを削除して、代わりにメソッドを使用することを提案しました。

私たち2人は他のことで忙しかったので、彼はProperty Design「フレームワーク設計ガイドライン」のセクション。本の中で作家はただ避けようと言った:

ゲッターよりも広いアクセシビリティを持つセッターを持つプロパティ

そして今、私はなぜそれがセットオンリープロパティを持つことが推奨されないのか疑問に思っていますか?誰かが私のために明確にできますか?

期待と関係があるのではないでしょうか。セットのみのプロパティは一般的ではなく、プロパティは通常、あまり処理せずに値を格納するためだけに「ダム」セットに使用されます。セッターで多くの作業を行う場合は、メソッドを使用することをお勧めします。メソッドの実行には時間がかかり、副作用が生じる可能性があることを人々は期待しています。プロパティに同様の種類の動作を実装すると、期待に反するコードが生成される可能性があります。

Microsoftのプロパティ使用ガイドライン の関連セクションは次のとおりです。

プロパティとメソッド

クラスライブラリの設計者は、多くの場合、クラスメンバーをプロパティまたはメソッドとして実装するかどうかを決定する必要があります。一般に、メソッドはアクションを表し、プロパティはデータを表します。次のガイドラインを使用して、これらのオプションを選択してください。

  • メンバーが論理データメンバーである場合は、プロパティを使用します。次のメンバー宣言では、Nameはクラスの論理メンバーであるため、プロパティです。
public string Name
{
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
}

次の場合にメソッドを使用します。

  • 操作は、Object.ToStringなどの変換です。
  • 操作は、ユーザーに結果をキャッシュすることを検討する必要があることを伝えたいほど高価です。
  • getアクセサーを使用してプロパティ値を取得すると、目に見える副作用があります。
  • メンバーを続けて2回呼び出すと、異なる結果になります。
  • 実行の順序は重要です。タイプのプロパティは、任意の順序で設定および取得できる必要があることに注意してください。
  • メンバーは静的ですが、変更可能な値を返します。
  • メンバーは配列を返します。配列を返すプロパティは、誤解を招く可能性があります。通常、ユーザーが内部状態を変更できないように、内部配列のコピーを返す必要があります。これは、ユーザーがそれをインデックス付きプロパティであると簡単に想定できるという事実と相まって、非効率的なコードにつながります。次のコード例では、Methodsプロパティを呼び出すたびに、配列のコピーが作成されます。その結果、配列の2 ^ n + 1個のコピーが次のループで作成されます。
Type type = // Get a type.
for (int i = 0; i < type.Methods.Length; i++)
{
   if (type.Methods[i].Name.Equals ("text"))
   {
      // Perform some operation.
   }
}

[...長い例をスキップ...]

読み取り専用および書き込み専用プロパティ

ユーザーがプロパティの論理データメンバーを変更できない場合は、読み取り専用プロパティを使用する必要があります。書き込み専用プロパティは使用しないでください。

15
Adam Lear

まあ、私はあなたが何かにプロパティを設定できるがそれを得ることができない場合、何かがあなたが設定した値を変更/上書きするかどうかは決してわからないと思います。設定した値に依存していて、(なんらかの理由で)取得したい時刻までその値を保持できない場合は、問題になる可能性があります。

設定のみのプロパティの代わりにメソッドを使用すると、ユーザーの混乱が少し少なくなります。メソッドのnameは通常set-またはget-を示しますが、プロパティ名は通常、何かができることを示していませんonly設定され、notが取得されます。プロパティが「ReadOnlyBackgroundColour」のようなものだったとしたら、他のプログラマーを混乱させることはないと思いますが、それは奇妙に見えるだけです。

ほとんどの場合、それは単に意味をなさないからです。設定できるが読み取れないプロパティはどれですか?

OOが現実の世界をよりよく表すためのものである場合、設定のみのプロパティは、モデリングがかなりオフであることを示唆している可能性があります。

編集:参照: https://stackoverflow.com/questions/4564928/are-set-only-properties-bad-practice これは本質的に直感的ではなく、設定のみのプロパティは基本的には別の名前のメソッドであるため、メソッドを使用する必要があります。

6
Jon Hopkins