Java民によくいるsetterやgetterの信奉者はその罪深さを知るべきでは?

setterとgetterというバカバカしいものがありまして。クラスの中のメンバ変数をわざわざprivateにして、publicメソッドのsetXXX()やgetXXX()を作ってその変数にアクセスさせるという。結果、メンバにアクセスするコードはこうなる。

a.getXXX().getYYY().getZZZ().setAAA(1);

これ、外からprivateメンバにアクセスしてるんですよ。こういうイリーガルなコードが世間に流布していて、あまつさえ書いてるやつらは正しいことをしてると思ってるんです。クソが。

まあ、そういう文化と称するものがあるんですよ。何でもかんでもprivate変数にpublicなgetter/setter。これをIDEが自動生成するからいいんだそうです。おめでとう、人類はそこまで思考停止するようになった。例えば将来、最高に頭のいいコーディングAIが出てきたとして、そいつが書くコードがgetter/setterの嵐になっていることを想像できるでしょうか? なってるわけないですよね。

自動生成もコードに残ってると変な気分になるという罪悪感を感じた人物がいまして、lombokというのを作ったんです。これなら変数やクラスに@Setterとか@Getterをつけておくことで自動でsetter/getterのpublicメソッドを生成してくれるんですよ。なんてアホなんだ…で、みんな「これは偉大な発明だ!」みたいに感激して、ありがたがって使ってる。…教えてあげるけど、それオブジェクト指向が始まった頃からあるんですよ、publicって言うんです。それで変数を直接publicにできるんです。お前ら知らなかったんだろうけど! すごいでしょ。

いいですか、setterとgetterが存在すべき条件を考えてからprivate変数を作りましょうよ。JavaにはC#にあるようなメンバ変数へのアクセスにread/writeごとの権限をつけるシンタックスシュガーがないため、setterとgetterをprotected/private/publicとすることでread/writeごとの権限を管理できるようにしたわけです。若干の論理を入れたい場合もこれに相当しますが、そんな使い方は今となっては逆に単純に悪になってしまったので犬の餌にでもしとけ。クソが。

あとはライブラリとしてAPIを作る場合。これは将来の内部コードの変更に備えてgetter/setterをつけておいて、あとでメンバ変数の名前や役割を変えるとなった時にgetter/setterの名前を変えずに辻褄を合わせることができます。ただ、普通のライブラリだとそのくらいの非互換性は許容されていると思いますけどね。無理に互換性を保とうとすると効率悪くなりますし。割と広い、OSのシステムコールみたいなレベルのAPIの場合は、守り続けないといけないケースもありますけど、そのレイヤのプログラマはバカでない頭脳をしているのでsetter/getterなんて使ってない。

そういうわけで、read onlyな変数が作れないのでprivate変数にpublic getterをつけるというのはいいです。残念だがそれは認めるしかない。それなりの理由がある場合はいいんです。ですが、単にアクセサをつけるのが習慣なので…というバカバカしい理由で環境汚染を進めるのはやめてほしいです。だって実行効率は悪くなりますし、シンボルやコードも増えて、実行バイナリのサイズも増えますよね。ストップ地球温暖化。その罪を知りなさい。クソが。

あとEclipseの場合、このメンバ変数はどこからアクセスされているんだろう…と思う時に、lombokが作ったsetter/getter経由でアクセスされた時のリファレンスを辿れないんですよ。しょうがないので、まあライフハックみたいなものだけどどうしているかというと、メンバ変数の名前を適当に変えて保存してみて、それでコンパイルエラーになって赤くなったところ。そこからアクセスされているのだ、という感じで探していますね。それで自分がsetter/getter派に飼いならされて日に日に知性が失われていくことを感じるんですよ。AIが進歩して人類を追い越すのではなく、人類が後退しているのだ。

それと困ったこととしては、getXXX()とかsetXXX()て名前の別の意味のメソッドを作るときにためらわれる、というね。getterとは違う、getterみたいな名前のメソッドなんて、誤解されちゃうから作れないじゃないですか。使いやすい単純な名前取るなよ。どうせならもっと使いにくい単語…acquireとか? にすりゃいいじゃねーか。クソが。

というわけで、setter/getterつけてるメンバ変数は全部publicにしても不都合はないんです。たいてい、その方が少しはマシなコードになり、世界は救われます。それにしても、Java民が毎度毎度、よりによってクソな方の習慣に魅せられるのはなぜなのか。

コメント

  1. 同意見です。会社の先輩(というか管理職w)のコードレビューで、「getter/setterはどこにいった?」と言われたときは顎が外れそうになりました。「単純にgetter/setter作るならpublicプロパティで問題ないですよね」と説明しても理解していただけず、「カプセル化がどうたらこうたら」。レビューが終わらないため泣く泣く言うとおりにしましたが、クソなコードを世に生み出してしまったなと今でも後悔しています。。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です