主な理由は、OOP のカプセル化とは関係なく (そうであるとよく言われますが)、すべてがバージョン管理に関係しています。
実際、OOP の立場から、カプセル化の欠如は、カプセル化のふりをしてそれを吹き飛ばすものよりも明確であるため、フィールドは「ブラインド」プロパティよりも優れていると主張できます。カプセル化が重要な場合は、カプセル化がない場合に確認することをお勧めします。
Foo というプロパティは、外部からは Foo という public フィールドと同じようには扱われません。一部の言語では、これは明示的 (その言語はプロパティを直接サポートしていないため、getFoo と setFoo があります) であり、一部の言語では暗黙的です (C# と VB.NET はプロパティを直接サポートしていますが、バイナリ互換ではありません)。フィールドとフィールドを使用するようにコンパイルされたコードは、プロパティに変更された場合に壊れます。その逆も同様です)。
Foo が「ブラインド」セットを実行して基になるフィールドを書き込むだけの場合、現在、フィールドを公開することよりもカプセル化の利点はありません。
ただし、後で無効な値を防ぐためにカプセル化を利用する必要がある場合 (無効な値は常に防止する必要がありますが、最初にクラスを作成したときに無効な場所に気付かなかったり、「有効」が変更された可能性があります)スコープの変更)、メモ化された評価をラップする、オブジェクト内の他の変更をトリガーする、変更時イベントをトリガーする、高価な不必要な同等のセットを防ぐなどの場合、実行中のコードを壊さずにその変更を行うことはできません。
クラスが問題のコンポーネントの内部にある場合、これは問題ではありません。フィールドが一般的な YAGNI 原則の下で適切に読み取れる場合は、フィールドを使用すると言えます。ただし、YAGNI はコンポーネントの境界を越えてうまく動作しません (コンポーネントが今日動作する必要がある場合、私のコンポーネントが依存しているコンポーネントを変更した後、明日動作する必要があることは確かです) 。プロパティを事前に使用することは理にかなっています。