【发布时间】:2014-11-12 00:00:03
【问题描述】:
寻找以下问题的设计指南。 我收到两个字符串值 - 操作和消息,并且必须调用处理字符串消息的适当方法(processM1MessageVer1、processM1MessageVer2、processM2MessageVer1 ...)。我必须调用的方法取决于给定的字符串操作。每种处理方法都有 2 个版本(但将来可能会有更多)。我必须调用的方法版本由全局变量版本决定。每个方法都返回不同类型的对象(ResultObject1、ResultObject2 ...)。结果必须被序列化,转换为base64并返回。
有没有更优雅的写法(消除重复代码,使未来可能的更改更容易,减少代码......):
string usingVersion = "ver1";
public string processRequest(string action, string message)
if (usingVersion == "ver1"){
processRequestVer1(action, message);
}
else{
processRequestVer2(action, message);
}
}
//version 1
public string processRequestVer1(string action, string message){
string result = "";
switch (action){
case "m1":
ResultObject1 ro = processM1MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
case "m2":
ResultObject2 ro = processM2MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
case "m3":
ResultObject3 ro = processM3MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
}
return result;
}
//version 2
public string processRequestVer2(string action, string message){
string result = "";
switch (action){
case "m1":
ResultObject1 ro = processM1MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
case "m2":
ResultObject2 ro = processM2MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
case "m3":
ResultObject3 ro = processM3MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
}
return result;
}
如果必须处理的消息是不同的对象类型而不是字符串,这样会更简单,以便可以多态地调用适当的方法。每个流程方法返回不同对象类型的事实也使事情变得更加复杂。但这些不取决于我,我无法改变。
【问题讨论】:
-
使用开关在性能方面很好且高效。如果您在编译时知道所有可能性,那么这不是一个坏方法。在某些情况下,人们可能更喜欢字典,例如
Dictionary<string, Func<string, string>>在您的情况下,它填充了键(即否则将是case标签)和Func<T, TResult>委托实例用于进行适当处理的方法(即采用message并导致 @987654326 @)。这不会比switch表现更好,但根据偏好,有些人可能更喜欢它。