読者です 読者をやめる 読者になる 読者になる

私が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によって実装されている