0

与えられた : 複雑なアルゴリズム。

switch obj.field1 + "-" + obj.field2
case "A-A":
    return Sample(obj){Error = "Type can't be matched"}
case "A-B":
    {
    if(obj.field3 != null){
        var match = otherObjectCollection.FirstOrDefault(otherOb.field2 == obj.field3);
        return mathc != null? Sample(obj,match) : Sample(obj){Error="Can't find match"}
    }else{use field4...}
}
case "A-C":
{
var related = objectCollection.FirstOrDefault(parent.field4 == obj.field3);
if(related == null)
 return Sample(obj){Error = "Can't find parent"}
else {
  if(related.field3 != null){
       var match = otherObjectCollection.FirstOrDefault(otherOb.field2 == related.field3);
       return mathc != null? Samble(obj,match) : Sample(obj){Error="Can't find match"}
  }else{ use field 4 ...}

}
    }

等々。トリッキーなルールがたくさん。私は次の決定を思いついた:

abstract class AggregationChain{
    protected MyObj Obj;
    abstract string Type{get;}
    abstract Priority Priority{get;}
    abstract bool Decide(MyObj obj);
    abstract Sample Aggregate(ICollection<MyObj> objects,ICollection<OtherObj> otherobjects);
    bool CanDecide(MyObj obj){
        if(Decide(obj)){
           Obj = obj;
           return true;
        }
        return false;
    }
 }

これで、たとえば ChainLinks を使用できるようになりました。

 class ABAggregationChainLink{

        string Type{get{return "A-B"}}
        Priority Priority{get{return Priority.High}}
        bool Decide(MyObj obj){ 
           return obj.fiel2 != null;
        }
        Sample Aggregate(ICollection<MyObj> objects,ICollection<OtherObj> otherobjects){
            var match = OtherObjectCollection.FirstOrDefault(otherOb.field2 == obj.field3);
            return mathc != null? Samble(obj,match) : Sample(obj){Error="Can't find match"}
        }

     }

この例では、"else" 状況を処理する AB ChainLink をもう 1 つ作成する必要があります。また、すべてのスイッチ ケースについて、異なる ChainLinks を作成する必要があります。もちろん、これによりクラスの数と実装の時間が増加しますが、クラスは単体テストにより適していて、私の観点からはより拡張可能で柔軟です。

質問 :

  1. 私は考えています-Open-Closeと「良いプログラミング」に過度に興奮しているのかもしれません.
  2. ここでより良い解決策になる可能性がありますか?

PS。これは C# コードではありません。主なロジックを説明しようとしました。

4

1 に答える 1