🔪

昔話「getter/setter おじいさん」

2023/02/06に公開

昔々あるところに……

getter/setter を使って書かれたソースコードがありました。すべてのクラス変数がprivateとして記述されていて、それらの変数ひとつひとつにgetter/setterが用意されているのです。私がそのソースコードを読んでいると、いつの間にか隣に立っているおじいさんは言いました。
「オブジェクト指向ではクラス変数をprivateで書くから、外部から勝手に変更されることがないのだよ」
と。さらに続けていいました。
「だから、外部から変更するときにはgetter/setterを使うんじゃ」
と。私はその二言だけで徹夜明けの出勤日の夕方にありそうな頭痛に襲われました。さらに頭の中では「違う、そうじゃない」という言葉とともに曲が流れはじめて、その曲のジャケットまで鮮明に思い出してしまいました。
私はポケットからE. エヴァンスのドメイン駆動設計について書かれた本を取り出し
「この本を読んでぜひ感想を聞かせてほしい」
と伝え、気持ちを落ち着かせるためにその場を後にしました。

また、別の日には……

オブジェクトをキー&バリューの形で map に変換しているソースコードがありました。私はそのソースコードを見た瞬間に何をやっているのかわからず、しばし茫然自失としていました。すると、いつの間にか隣に立っているおじいさんは言いました。
「mapを使うとオブジェクトにはないキーを作って値を持たせられるから便利なんじゃ」
と。さらに続けて言いました。
「mapならgetter/setterがなくても文字列でアクセスできるから便利なんじゃ」
と。もう訳が分かりません。私の頭が話の内容を理解することを拒否しています。
私は本能的に危険を感じ、E. エヴァンスのドメイン駆動設計について書かれた本をそっと置いてその場を後にしました。

さすがに脚色はありますが……

いろいろな案件に携わっていると、このようなおじいさんはいないとしても、このようなソースコードに出会ったことがある人はそれなりにいるのではないでしょうか。と言いつつも、弊社にはこのようなおじいさんがいないとも言い切れないような気がしなくもないのが怖いところですが……。
時代が変われば言葉も変わるように、時代に応じてプログラミングの仕方が変わるのは仕方がないことだと思いますが、今でも getter/setter を現役だとは思わない方がいいのは間違いないと思います。ナウでヤングな若者は getter/setter を使わないと思うわけです。

説明不要かと思いますが……

一応補足として、上記2つの例は今の時代ではアンチパターンとして扱われていると思っています。
private なクラス変数に getter/setter をつけることは実質 public なクラス変数と同義で、private と public の違いもわからないと自己紹介していることになります。強いて言えば、getter/setter 内で出力形式を統一できたり、チェックをできたりするので、それらの拡張性を残しておくことができる点がメリットですが、そもそも getter/setter が機能を持ちすぎると「この getter はこの機能があるけど、あの getter はただの値取得」みたいなことになるので、やはりアンチパターンだと思っています。
2つめのオブジェクトを map に直すことで疑似的にプロパティを増やすことができるのは、オブジェクト指向を何も理解していないのと同義です。さらに、キーの文字列でバリューにアクセスするのは、文字列のスペルミスを考慮すると、まだ getter/setter の方がマシなレベルです(文字列だとIDEのチェックが効かないため)。

結局、一番の問題は……

一度学んだソフトウェア開発の技術を親と思ってついていくプログラマーがいることだと思ってます。プログラミング言語が進化するのに合わせて、コーディングの仕方も進化しているのにも関わらず、プログラミング言語を道具として使うプログラマー側が進化できていなかったりしています。今学んでいるコーディングの仕方も10年後にはおじいさん扱いされているかもしれません。安易に新しい技術を使う必要はないですが、新しい技術をインプットしていく姿勢だけは忘れてはいけないと思いました。

Discussion