web-dev-qa-db-ja.com

プライベートゲッターを避ける理由はありますか?

私はこのようなものを書くことができましたが(C#で。もちろん、他の言語でも同等のものがあります):

public int SomeNumber { private get; set; }

neverがこのような状況に遭遇したことはありません。特に理由はありますか?


編集:質問は プライベートセッターおよびゲッター の複製として提案されています。プロパティをフィールドとして使用することについての質問があります(プライベートゲッターおよびセッター):

ただし、オブジェクトの外部からアクセスしてはならないプロパティは、単にそれらのセッター/ゲッターを保護対象として指定します。

プライベートゲッターとパブリックセッターを持つプロパティに関するものなので、私の質問は重複していません。

2
Sipo

私はそのようなコードをよく見ます、そして私はそれが好きではありません。

私の同僚は、インスタンスにいくつかの依存関係を注入するためにそれをよく使用します。しかし、そうすることで、それらは後で変更するためにそのプロパティを開きますが、プロパティはオブジェクトの作成時にのみ設定されることが期待されています。

そして、それが私が気に入らない理由です。パブリックセッターが後で呼び出され、安定していると思ったインスタンスの状態を変更することを確信することができません。

つまり、依存性注入を目的としている場合は、オブジェクトの作成時に適切な依存性注入の方法を使用します。インスタンスの状態を変更することを意図している場合は、メソッド(「コマンド」)を使用してその目的を推測することをお勧めします。

8
Bernhard Hiller

これまでにこれを見たことがない理由は、そのようなコードがすぐに問題を引き起こすからではありません。理由はおそらく:この組み合わせは特に有用ではありません

セッターをパブリックにするコードは、呼び出し側のコードがオブジェクトの状態を変更することを許可し、呼び出し側のコードはセッターを通じて渡されたコンテンツの内容をすでに「認識」しており、このコンテンツをゲッタープライベート。したがって、それによるメリットはあまりありません。まったく逆に、オブジェクトの状態をテストしたり、オブジェクトを再利用したりすることは、通常、難しくなります。

これを、たとえば、プライベートセッターとパブリックゲッターの組み合わせと比較してください。これは、多くの場合、不要な副作用を制限または防止するのに非常に役立ち、不変のオブジェクトを設計するときに必要になります。

4
Doc Brown