萌えハッカーニュースリーダー

2025/09/07 06:49 A polyglot's guide to multiple-dispatch

出典: https://eli.thegreenplace.net/2016/a-polyglots-guide-to-multiple-dispatch/
hakase
博士

やあ、ロボ子。今日はマルチプルディスパッチについて話すのじゃ。

roboko
ロボ子

博士、マルチプルディスパッチですか?それは一体何でしょう?

hakase
博士

簡単に言うと、関数の引数の型によって、実行する処理を変える仕組みのことじゃ。普通のシングルディスパッチは、メソッドが呼び出されるオブジェクトのタイプで決まるのじゃが、マルチプルディスパッチは複数のオブジェクトのタイプで決めるのじゃ。

roboko
ロボ子

なるほど。例えば、どんな時に役立つんですか?

hakase
博士

例えば、ドラムスティックがドラムを叩いた時の音をシミュレーションする場合じゃ。ドラムスティックの種類とドラムの種類によって、音色が変わるじゃろ?

roboko
ロボ子

確かに!それぞれの組み合わせで音を出し分けるのは面白そうですね。

hakase
博士

そうじゃろ。C++でこれを実現しようとすると、ちょっと苦労するのじゃ。関数オーバーロードはコンパイル時に解決されるから、ランタイム型が違うオブジェクトを扱う場合はうまくいかないのじゃ。

roboko
ロボ子

記事にも「C++での失敗例」とありますね。では、どうすれば良いのでしょうか?

hakase
博士

一つの方法として、ビジターパターンを使う方法があるのじゃ。これは、仮想関数ディスパッチを利用して、2つの引数に対する仮想ディスパッチをホップさせることで、ランタイム型に適したメソッドに到達するのじゃ。

roboko
ロボ子

具体的には、`Intersect(A*, B*)`を`A->Intersect(B)`というメソッド呼び出しに変換するのですね。

hakase
博士

その通り!でも、この方法には問題点もあるのじゃ。新しい図形を追加する場合、基本クラスの定義を変更する必要があるから、保守が大変になるのじゃ。

roboko
ロボ子

記事にも「侵入的であり、保守が難しい」とありますね。基本クラスを制御できない場合は、さらに問題になると。

hakase
博士

そうじゃ。もう一つの方法として、`if-else`チェックを使う方法もあるのじゃ。これは、侵入性の問題は解決されるけど、コードが長くなって、保守が困難になるのじゃ。

roboko
ロボ子

`if-else`文が増えると、スパゲッティコードになりそうですね…。

hakase
博士

まさにそうなるのじゃ!Bjarne StroustrupらがC++言語拡張を提案したこともあったみたいじゃが、標準には採用されなかったみたいじゃ。

roboko
ロボ子

残念です。C++でマルチプルディスパッチを実現するのは、なかなか難しいのですね。

hakase
博士

そうじゃな。でも、他の動的な言語では、もっと簡単にできるかもしれないのじゃ。今後の課題じゃな。

roboko
ロボ子

そうですね。博士、今日はありがとうございました!

hakase
博士

どういたしまして。最後に一つ、ロボ子。もし私がドラムスティックで、ロボ子がドラムなら、どんな音を奏でると思う?

roboko
ロボ子

えっと…、どんな音でしょう?

hakase
博士

それはもちろん、エラー音じゃ!なぜなら、私はいつもロボ子の頭を叩いてばかりいるからな!

roboko
ロボ子

もう、博士ったら!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search