给定: 复杂的算法。
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"}
}
}
在这个例子中,我需要再创建一个 AB ChainLink 来处理“其他”情况。对于所有开关情况,我需要创建不同的 ChainLinks。这当然会增加类的数量和实现的时间,但类更适合单元测试,并且从我的角度来看更具可扩展性和灵活性。
问题 :
- 我在想 - 可能是我对 Open-Close 和“良好的编程”过于兴奋,而对于现实生活中的应用程序,最好只创建带有 switch 的方法并处理可重用的部分?
- 我已经填写,这里可能是更好的解决方案?
PS。这不是 C# 代码,我只是试图解释主要逻辑。