メソッドの多重定義(オーバーロード)について考える
最近、オブジェクト指向入門第2版を読んでいます。
その本の中でメソッドの多重定義はオブジェクト指向の目指す再利用性についてほとんど貢献していないと書いてあり少しばかり考察を。
本の中ではこのように書いてます。
再利用性を探求する上でルーチンの多重定義は実際に何をもたらしてくれるのだろうか。なるほど、いちいち名前を考えなくていいってだけで再利用性とはあまり関係ないですね。
あまり多くはない。
これは構文上の機能であり、同じ操作を表すさまざまな実装のそれぞれに異なる名前を考える手間を省き、本質的にはコンパイラにその負担を押し付けている。
しかし、これでは再利用性の主要な問題が何も解決されない。
…
中略
…
ソフトウェア構築の基本ルールとは公明正大の原則に基づくものである。
意味の違いがソフトウェアテキストの違いに反映されるべきである。
このことはソフトウェアの分かりやすさを向上させ、エラーの危険を最小限にする上でとても重要である。
あとは特に「意味の違いがソフトウェアテキストの違いに反映されるべきである。」というくだりは非常に大事だと思います。
名前付けるのめんどくさいと言って思考停止させるために多重定義を使うのはよくないですね。
個人的には
findCustomerById(Integer id) findCustomerById(int id)
のようにプリミティブ型とラッパークラスの違いなら処理内容も同じだと思うのでありだと思いますが
findCustomer(int id) findCustomer(String name)
のような場合はfindCustomerById、findCustomerByNameときっちり名前を変えたほうが、処理内容の想像もできていいかと思います。
オブジェクト指向言語の特徴としてよく挙げられるメソッドの多重定義ですがよく考えるとあまり重要な特徴じゃないのではと思ってしまいます。
なんにせよメソッドにはきっちりと分かりやすい名前をつけるのが大事だなとあらためて教えてもらいました。