Setter/Getterについて

最近、ちょっと新しく修得した技術として更新する内容が枯渇気味なので、
先日新卒から質問されたことに対して回答したことなどを書いてみます。
おおよそ大丈夫だとは思いますが、個人的な主観も大いに入っているかと。



◆ なぜSetter/Getterを作る必要があるのか。public変数でいいのでは?


そもそもな話、オブジェクト指向にあるカプセル化の概念から
『クラスのプロパティにクラス外から直接アクセスして内容を
書き換える』と言う行為自体が基本的に非推奨です。


メンバ変数(フィールド)は基本的に「private」なのでクラス外から
直接的に触れないようにする必要があります。


これを行うメリットですが、例えばgetter/setterを利用することで

1.複数人で開発時に誰かが勝手なルールでプロパティの値を変更してしまうことを防ぐ
2.「setter」や「getter」を利用していれば、それらの内容が変わっていても呼び出す側に影響しない

などの利点があります。


1.についてですが、例えば「このフィールドはクラス内でなんらかの処理を行った結果を表す」
としていた場合でも、publicなフィールドにしていると他の誰か、もしくはそのことを
忘れていた自分によって誤った値が代入されてしまう可能性があります。


そのような事態を防ぐために、たとえばフィールド自体をprivateとしておきgetterメソッド
のみを作り、setterを作らないことで「このフィールドの値は読み取り専用」などの
区分わけを行ったりします。



2.について。 例えばsetterの場合、あるフィールドの値は必ず0〜99の範囲となるように
100との余りを出そうと考えた場合に、setterを利用していないと全てのフィールドに
アクセスしている箇所に対して%100などを指定する羽目になります。


ただし、setterを利用しているとset○○の関数内でフィールドに値を
代入する際に、例えば「this.x = _x % 100」などと書くだけの変更で済みます。


getterの場合も同様で、何らかのルールに基づいた形に返却する値を
変更したくなったとしても、get○○関数内の処理を修正してやるだけで
変更箇所が少なくなる、などのメリットがあります。




本当に小規模な、サンプルソース程度のものならばgetterやsetterを
利用しない方が簡単に書けるから便利だ、と思うかもしれません。
ただし、将来の拡張性や保守性を見据えた場合には利用しないと言う選択肢は考えられません。