私がvisitorパターンが嫌いな理由
私には昔から、GOFのデザインパターンというものを学習したときからどうにも『そり』が合わないデザインパターンがあった
visitorパターンである
別に理解できなかったわけではない。使えないわけでもない。実際何度か使う場面もあった
だが、思いだすたび、必要になるたび、私は考えるのだ
「こいつは何かが腐っている!!」
先日、ついに啓示を得た。オラクルだ。
そして私はついに、visitorパターンが嫌いな理由を理解した。理解してしまった
神は私の耳元でこうささやいた
「お前はvisitorパターンの名前が一番嫌いなんだよ」
visitorパターンのギミックはこうだ
1:accepterさんは仮想メンバ関数でvisitorパターンを受け入れる
2:visitorさんは、*thisを受け取る。この時*thisは仮想メンバ関数のものなので派生クラス型になる
3:適切な関数が呼ばれる
という具合だ。ふむ、visitorパターンはいいパターンだ。結婚したい
しかし、私は気づいてしまった。ここで注目されるべきはAcceptさんの努力であり、安全に行われたダウンキャスト的効果である
少なくとも私はそう考えている。注目すべきはVisitorではない
私がそう考えるに至ったコードは以下のようなものだ
apply(a, make_overload([](SubA){}, [](SubB){}));
Visitorクラスは滅びた。しかしそれでもacceptは必要だ。ゆえに本当に必要なのはAccepterの方だ
故にAccepterさんの功績を讃えAccepterパターンと呼んで差し上げるのが少なくともVisitorより適切であると強く感じるのだ
ちなみにこのコードはvariantによって実装されている