Rubyでのオーバーメソッドについて
はじめに
Javaにはオーバーメソッドという機能があります。
詳しくは、割愛します。リンクを参照。
疑問
プラクティス中に複数の引数があるメソッドをコーディング中に疑問が湧きまして、
型制限に厳密でないRubyは、
メソッド実行時に意図しない型の引数を使用してエラーを起こすのではないか?
ということです。
そこでGoogle先生に尋ねると、もろにその話題を取り扱った記事がありました。
Rubyでオーバーロードはできるのかについてですが、率直に言うとオーバーロードはできません。
その理由はRubyには引数の型判定が存在しないからです。
そもそもスクリプト言語なのでその概念が存在しないようです。
ただし、
Rubyはモジュール(拡張機能)をインストールするだけで、それにも対応できるようになるのです。自分の使いたいクラスにOverloaderというモジュールを追加しメソッドで呼び出すことでオーバーロードが可能になります。
実装用のライブラリの解説:
https://pocke.hatenablog.com/entry/2019/04/28/014018
(引数の個数で判断しているようだ。多分、Maybe・・・)
有識者のアドバイス
以下、フィヨルドブートキャンプのメンターの方から頂いたアドバイスです。
オーバーロードとは「引数の型や数に応じて、呼び出すメソッドを切り替えられるオブジェクト指向言語でよくある機能」と認識しているのですが、Rubyはこれには対応していませんね。
ただし、引数の数についてはデフォルト引数やキーワード引数を使って、柔軟に対応することが多いです。
型がないから間違ったクラスのオブジェクトを渡してしまう可能性があるのは確かで、Ruby3以降だと型を扱えるようにする動きも出てきていますね。(RBS)
型が間違っていてもメソッドを持っていれば動くというのは
「ダックタイピング」と呼ばれるのですが、これはこれで便利な場合もあります。
オブジェクト指向のポリモーフィズムと呼ばれる手法を用いる場合に、
型がある言語だとInterfaceを別途定義する必要があるのですが、
Rubyの場合はメソッド名を合わせるだけで実現ができます。
これはRubyが「楽しくプログラミングできる言語である」と呼ばれる所以だと思っています。
アドバイスありがとうございます。
意味をしっかり語弊なく認識するため、理解が微妙〜なものを確認していきます。
別記事に切り分けます。
Ruby:デフォルト引数やキーワード引数について
Ruby:RBS
Ruby:ダックタイピング
まとめ
→型の指定を行う流れもできている。
しかし、型一致せずとも扱える自由さがRubyの長所である。
(ダックタイピングの考え方)
という結論になりました。
さて私がオーバーロードや型の型の不一致を気にしながらコーディングする日は来るのでしょうか?
それはまだまだ遠いでしょうが、エラーの時に少しでも対処できるきっかけになればいいなと思います。
ちなみに
自分は業務でこの書き方を実際に行っているPGを見たことがないです。
その程度のコードディングレベルの現場しか行ったことがないからです。
※例えば分かりやすいのは下記の伊藤さんの記事みたいな、メソッド名がそれぞれあったり、今や禁断のクラス名のManagerXXXXなんとかが、恐ろしいほど定義されている様な20年選手のコードの現場です。
(古くてもそもそもの設計がしっかりされていて、更改案件時に改修できる予算がある様な現場ではないです。)
ひどいコードをメンテしてきたからこそ実感する、良いコードや良い設計の大切さ - give IT a try
Design Horror! - give IT a try
皆さんたくさんの大変な現場・案件を乗り越えての今があるのでしょうね・・・
わたしも頑張ろう!