Visitorパターンと他のデザインパターンを比較してみる

会社の先輩からインプットもらったので、理解定着させるためにも整理してみます。知識0前提はは承知を。

発端

この話になった背景は会社でやってもらってるコードレビューの場で、前からずっと継ぎ足されていたレガシーコードどう直す?となった時に出てきた話。

if(){

//処理。めっちゃ長い

}else if(hoge){

//処理。めっちゃ長い

}else if(huga){

//処理。めっちゃ長い

}else {

//処理。めっちゃ長い

}

こんなコードが出てきたら、StrategyパターンやCommandパターンが適用できないか検討するといいよーと。 今回はVisitorパターンで書けないか考えてみたと先輩が言ってたので私もそれで書いてみます。と書いてみることに。

Visitorパターン

visitorパターンとは http://www.techscore.com/tech/DesignPattern/Visitor.html/ https://ja.wikipedia.org/wiki/Visitor_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Visitorパターン調べてると、Strategyとか色々出てきてよくわからない。 どんな時に使うパターンかというと、工程のような処理がいくつかあって種類によって工程が変わったり、なかったりする、みたいのをきれいに直せるよーらしい。

なので、以下みたいなコードが出てきたらVisitorパターンで書けないか検討すると良いみたい。

if(){

}

if(){

}
if(){

}

Visitorパターンにもいくつか種類があってinternalVisitorパターンとexternalVisitorパターンがあるんだって! http://qiita.com/lyrical_logical/items/bc6126f34a571a2c4f97

Visitorパターンは「データ構造」「走査方法」「処理」を分けて書くのがコアな考え方。 走査方法て何って感じだったけど「案内」と変えて聞くとちょっとイメージしやすかった。 案内係と実際の処理係。何を処理すればいいのかは処理係が知っているので、案内係は処理の順番だけ案内すればよい。ってイメージつけてる。

FactoryやStrategyとの比較

  • Factoryは生成に関するパターン
  • アルゴリズムを切り替えるのがStrategy
  • データ・走査方法・処理を分けるのがVisitor と一言で書くと、こんなかんじ?

例えばシャツの工程の話

例えばシャツを作りますー!の話をVisitorと例えばFactoryで考え方を比較してみる図。 f:id:chiiia12:20161212002120j:plain Visitorは一つの工程を順番にvisitしていく。工程の中の一つだけ変えたものを作りたい!ってなった時に一つの工程を入れ替えるみたいなことが可能。

f:id:chiiia12:20161212002056j:plain Factoryと比べると縦切りなのか横切りなのかで違うことがわかる。 どっちを使うかは、どういう仕様かによって変わってくるのかと思った。

結局デザインパターンって

色々なパターンを見ていくと、「○○パターンだけ!」を使って書ける、みたいのはない。 この観点だとStrategyっぽいしここはVisitorの要素が混じってるよねとか。実際今回Visitorパターンを書いたつもりが(理解しきってないのもあって)ここはFactoryの考え方、ここはStrategyっぽいってなった。 色々パターンがあるけど、どう分けるか?の違いなだけでどれが最適!ていう答えはその時々。 で、デザインパターンは「はしか」みたいなものだから、若い内に一回かかっておいた方がよいらしい笑 デザインパターンをいれよう!と思っていれるのは違うので、デザパタのメリットなどを知っておいて知らないうちにかこのパターンで書けてた!っていうのが一番良いコードになるのかなぁ。 一回極端にデザインパターンを書いてみるとそこら辺の塩梅がわかるようになるとのこと。

これ。私も書いてみたい。 https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition