まさにトピックのタイトルが言っていること、
変数をパブリックとして定義して直接変更するよりも、パブリック関数を使用してローカル変数を変更したいのはどのような場合ですか?
データ メンバーを直接公開しないでください。不透明なアクセサーを使用すると、インターフェースを変更せずに、後日実装を変更できます。
私は知っておくべきだ。私は時々近道をしますが、それを後悔する機会がありました.
明らかに、変数を変更してオブジェクトの状態に他の影響を与える場合 (オブジェクトの他のプロパティを再計算するなど) は、mutator 関数を使用する必要があります。
オブジェクトを無効な状態にする変数を設定できる場合は、ミューテーター関数も使用する必要があります。このようにして、何か不正なことが起きようとしている場合に、例外をスローする (またはエラーを返す、または単に無視する) ことができます。これはデバッグに驚異的です。
しかし、いくつかの変数がミューテーター関数で変更でき、他の変数が公開されている場合、プログラマーはどれがどれであるかを追跡する必要があります。これは時間と労力の無駄なので、場合によってはすべてにミューテーター関数を使用するのが最も簡単です。
回答に影響するため、扱っている言語について言及する必要があります。
最初に考えるべきは、クラスへの API です。その API の安定性を維持したい場合は (そうするべきです!)、現在の単純な変数を後で本格的なメソッドに変更する方法を検討してください。
多くの言語では、呼び出しコードを変更せずに変数をメソッドに変更することはできません。C、C++、および Java は、このカテゴリに分類されます。これらの言語では public 変数を使用しないでください。後で変更する余地がなくなります。
Python では、呼び出し元を変更せずに変数をプロパティに変更できるため、前もって心配する必要はありません。パブリック変数を使用してください。
C# には、変数を透過的にメソッドに変更できるプロパティがあると思いますが、よくわかりません。
純粋にサービスの観点からオブジェクトを見ると、変数を公開することは、これらのサービスを公開する良い方法ではないことがわかります。
API は、オブジェクトが何であるかを反映する必要があります (高い凝集性を実現するため)。変数ですが、オブジェクトがこのサービスを公開するのは理にかなっているからです。
そう:
作成するすべてのクラスのすべてのメンバーにアクセサーまたはミューテーター関数を提供しないでください。アクセサー/ミューテーター メソッドがクラスのインターフェイス (API) の適切で有用な部分である場合にのみ、アクセサー/ミューテーター関数を提供します。
これらのメソッドをアクセサーまたはミューテーターと考えないでください。代わりに、オブジェクトの特定の抽象プロパティにアクセスまたは変更するメソッドと考えてください。今日はたまたま単一のメンバーによって表されますが、明日はより複雑な方法で計算される可能性があります。
クラス内の変数を変更したい場合は、Properties を使って最善を尽くしてください。
外部で変数を変更することはお勧めできません。
今後の展開も考えて。プログラム全体を変更せずに、プロパティの背後にいくつかのロジックを配置できます。