ところがどっこい 続・Flags VS Delegate VS Inheritance

前回の続き

〜あらすじ〜
デリゲート国ストラテジパターン族の軍と、フラグ国軍、そしてインヘリ国軍が、保守ヶ原で三つ巴の戦いをしていた。フラグ軍はその機動力を生かし、他両軍を撹乱したが、デリゲート軍とインヘリ軍の伏兵により本陣を突かれ、一時戦線を後退させる。デリゲート軍とインヘリ軍は膠着した戦いを続けるも、インヘリ軍は兵糧が尽き、デリゲート軍に押される展開に。その間戦線を整えたフラグ軍はどう動くか?!

本編

どうでも良いあらすじの後に、まじめな話しw。

あの後考えていたら、どうやらストラテジパターンにも欠点が。それは、「どの関数がストラテジパターン適用可能か」を設計段階で選定する必要がある。開発を進める過程で、想定外の関数(ストラテジパターン非適応関数)に動作パターンを増やしたい場合、ごっそり書き換え委&加筆する必要がでる。また、そうすると、コアクラスのメンバメソッドに「ストラテジパターンのメソッド」と「ストラテジパターン非適用のメソッド」が入り乱れることになる。これらの点を考えると、ストラテジパターンに保守性が高いのかちょっと疑わしくなってきた。想定外の関数をなくせばいいのだけれど、それだコアクラスが「クラス」というより、単なる「構造体」になる。なんだかなぁ

番外編で述べているが、「メンバ変数が増えるならサブクラスを作るべきだ」という話しと相まって、もしストラテジパターンの委譲用変数が増えるならば、継承も有りかも知れない。しかし仮にそこで継承をすると、その増えたメンバ変数が必要なくなる。結果、継承する必要性がないという矛盾に陥る。

この辺やはり似たようなことを考える人がいた。この人は継承優位の考え方のよう。ただ、継承の場合は、AクラスからクラスB(メソッドBの一部が変わったもの)、クラスC(メソッドCの一部が変わったもの)が派生していた場合、メソッドB、メソッドCを受け継いだままメソッドDが変化する場合、クラスDはクラスB、Cを多重継承しなければならなくなる。おまけにそういうパターンの数だけクラスを作らないといけない。



こうなると、フラグが優秀に見えてくる。なぁ。
フラグ管理だと

  1. 想定外の関数に条件分岐を挿入するのは比較的楽
  2. 加筆量はそれほど多くない
  3. 想定外の関数に挙動変更を加える場合、ストラテジパターンでもコアクラスに手を入れることになる

フラグ管理のネックのコアファイルに手を入れるという、ここをどうにかできないかな

追記

始めにストラテジパターンで設計して、構築。想定外の関数に手を入れなければならなくなったら、コアクラスを継承し、継承したクラスでストラテジパターンを適応、何てのも考えたけど、継承した時点で、上記の継承の問題と大して変わらなくなるか。