![見出し画像](https://assets.st-note.com/production/uploads/images/113809576/rectangle_large_type_2_9deca868d2ac332013d374b6384eb87a.png?width=1200)
🛠️訪問介護カーのvisitorパターン解説
あなたは訪問介護車の運転手です、昨今AST化している被介護者の構造を、うまいぐあいにVISITORパターンで整理して、癇癪持ちの被介護者には優しい屈強な介護人、重病だった被介護者にはいつでも入院できるように、医療知識豊富な介護人を多重ディスパッチすることとします。
(いろんな)操作を様々なノードクラスに分散させると、理解、維持、変更が困難なシステムになることだ。
いろいろあってごちゃごちゃしてるので、整理するために処理に訪問してもらうために、VISITORクラスの依存関係を構築する。
ということで、まあ訪問先はAST(抽象構文木)ということになる。
今回はクラス図というより、acceptメソッドとvisitメソッドの関係性がわからないといけない
クラスAがクラスBを引数にして(Nodeが)acceptメソッドを呼び出すとクラスAの中でクラスBの(VISITORの)visitメソッドが処理される。(ので、VISITORは受け入れ先を選べない)
訪問先(Where to visit)に呼び名はない、NodeとかElementとか呼ばれる。
そして多重継承、ダブルディスパッチ
ダブルディスパッチ Visitorパターンを使うと、クラスを変更することなく操作を追加することができます。Visitorはダブルディスパッチと呼ばれるテクニックを使うことでこれを実現しています。「ダブルディスパッチ」とは、リクエストの種類と受け手の種類によって、 実行される操作が変わることを意味します
訪問者は訪問先を選べないが、訪問先の情報はわかるので、訪問先に応じて処理を変えることができる。訪問先もあらかじめ、状況に応じて訪問者を選ぶことができるので、結果多重ディスパッチが可能となる。
![](https://assets.st-note.com/img/1693008277950-qh0D7SzVGP.png?width=1200)
大切なのは選択肢
(おまけ)多重ディスパッチ詳細
LISPの例が分かりやすい。引数の順番で判断してメソッドの処理が変わるという。
宇宙船が小惑星にぶつかったときと、小惑星が宇宙船にぶつかったときと、宇宙船同士がぶつかったときと、小惑星同士がぶつかったときで、それぞれ計算がちがくね、でも関係してるのは宇宙船と小惑星しかなくね?ということらしい。
Juliaも同じような感じ。これを可能にしてくれるのがVisitorパターンという。
言語定義や構文レベルで多重ディスパッチをサポートしていない言語では、ライブラリ拡張を利用して多重ディスパッチを追加できることが多い。JavaScriptやTypeScriptは構文レベルでの多重ディスパッチをサポートしていないが、ライブラリを介して多重ディスパッチを追加することは可能である。
![](https://assets.st-note.com/img/1653087719849-sOWOnxt6Ol.png?width=1200)
お願い致します