这个问题专门涉及 C#,但我也对 C++ 和 Java(甚至其他语言,如果它们有很酷的东西)的答案感兴趣。
我正在用我继承的“C using C# 语法”代码中的多态性替换 switch 语句。我一直在思考创建这些对象的最佳方法。我倾向于使用两种后备方法。我想知道我是否应该考虑其他可行的替代方案,或者只是进行健全性检查,以确保我实际上正在以合理的方式处理此问题。
我通常使用的技术:
- 使用无所不知的方法/类。此类将填充数据结构(最有可能是 Map)或使用 switch 语句即时构造。
- 使用一个盲目和愚蠢的类,该类使用配置文件和反射来创建实例/委托(delegate)/工厂/等的映射。然后按照与上面类似的方式使用 map 。
- ???
是否有我应该强烈考虑的#3、#4...等等?
一些细节...请注意,原始设计不是我的,而且我的时间有限,无法重写/重构整个内容。
之前的伪代码:
public string[] HandleMessage(object input) {
object parser = null;
string command = null;
if(input is XmlMessage) {
parser = new XmlMessageParser();
((XmlMessageParser)parser).setInput(input);
command = ((XmlMessageParser)parser).getCommand();
} else if(input is NameValuePairMessage) {
parser = new NameValuePairMessageParser();
((NameValuePairMessageParser)parser).setInput(input);
command = ((XmlMessageParser)parser).getCommand();
} else if(...) {
//blah blah blah
}
string[] result = new string[3];
switch(command) {
case "Add":
result = Utility.AddData(parser);
break;
case "Modify":
result = Utility.ModifyData(parser);
break;
case ... //blah blah
break;
}
return result;
}
我计划将其替换为(在对其他对象进行大量重构之后):
public ResultStruct HandleMessage(IParserInput input) {
IParser parser = this.GetParser(input.Type); //either Type or a property
Map<string,string> parameters = parser.Parse(input);
ICommand command = this.GetCommand(parameters); //in future, may need multiple params
return command.Execute(parameters); //to figure out which object to return.
}
问题是 GetParser 和 GetCommand 的实现应该是什么?
在那里放置一个 switch 语句(或调用由 switch 语句组成的工厂)似乎并不能真正解决问题。我只是将开关移到其他地方......这也许很好,因为它不再位于我的主要逻辑中间。
最佳答案
您可能希望将解析器实例化器放在对象本身上,例如,
public interface IParserInput
{
...
IParser GetParser()
ICommand GetCommand()
}
理论上,GetParser
需要的任何参数都应该由您的对象提供。
将会发生的是,对象本身将返回这些内容,而您的代码会发生什么:
public ResultStruct HandleMessage(IParserInput input)
{
IParser parser = input.GetParser();
Map<string,string> parameters = parser.Parse(input);
ICommand command = input.GetCommand();
return command.Execute(parameters);
}
现在这个解决方案并不完美。如果您无权访问 IParserInput
对象,它可能无法工作。但至少提供有关正确处理程序的信息的责任现在落在了解析者身上,而不是处理程序,这在这一点上似乎更正确。
关于c# - 逻辑现在是多态而不是 Switch,但是构造呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/633001/