前提がおかしい

getter/setterでぐぐって見つけたこのページ
・・・これはひどいと言わざるを得ない。
これは「オブジェクト指向プログラムで getter/setter メソッドを使わなければならない理由」じゃなくて、「フィールドへの直接アクセスよりは getter/setter を使うほうがいい理由」の方が正しいな。
というか、このページ、前提が「getter/setter を使わない == フィールドへの直接アクセス」だからおかしいのかも。


1番目*1はそんなことないし、2番目*2なんかはサイズ≒行数でクラスを分割するとか言っちゃってる時点でおかしい。


3番目*3はちょっと何言ってるのかわからない。

データメンバを直接操作するコードをいったん書くと、後でポリモルフィズムを使おうとしたときに手も足も出ない。

オブジェクト指向プログラムでgetter/setterメソッドを使わなければならない10の理由

うーん?


9番目*4なんてまさに前のエントリで指摘したのと同じですね・・・

オブジェクト指向にはデータメンバを外部から直接操作するという考え方がない(あるいは排除されている)ということだ。

オブジェクト指向プログラムでgetter/setterメソッドを使わなければならない10の理由

だからと言って getter/setter を使え、じゃないでしょう。もっと抽象度の高いメソッドを考えるべき。


5番目*5から8番目*6はよく利点として言われることだけど、個人的にはこれらもどうかなー、と思う。
メンバ変数のアクセス制御ができるって言ったって、結局 getter も setter も public になる運命にあるんですよ。用意したら最後。
6番目*7と7番目*8は同じことを表現を変えて言ってるだけ。で、これはそもそも getter や setter を用意してるからどこからアクセスしてるかを追跡する必要があるのであって、クラス内からのみアクセスされるようにして、クラスの粒度も適切に保つようにしておけばそんなもの気にもならない。
8番目は、よく言われることだけど getter/setter 大好き人間に限ってやってない。それに、getter/setter はどう使われるかわかったもんじゃないので、全ての状態を考慮して許される値を決定する必要があるから、制限はどうしても弱くせざるを得ない。


さて、10番目は宿題になっているようだからやらないとね。

10. getter/setter を使わなければならない理由なんてない

できる限り「どうやるか」ではなく、「何をするか」を表現すべきであり、getter/setter は「どうやるか」しか表さない点においてこれを無視している。
よって、getter/setter は極力使うべきではない。

*1:クラス内部のデータ表現を変えた場合でも呼び出し側のコードを変更する必要がない。

*2:クラスを分割することになっても、呼び出し側のコードを修正する必要がない。

*3:ポリモルフィズムを使おうとするとgetter/setterメソッドが必要になる。

*4:オブジェクト指向とはそういうものである。

*5:メンバ変数のアクセス制御ができるようになる。

*6:値の正当性チェックを入れることができる。

*7:データがどこで参照/変更されているかがコード中で見やすい。

*8:メンバ変数の参照や変更を追跡することができる。