gpt4 book ai didi

c# - 逻辑现在是多态而不是开关,但是构造呢?

转载 作者:行者123 更新时间:2023-11-30 22:50:23 27 4
gpt4 key购买 nike

这个问题专门针对 C#,但我也对 C++ 和 Java(或者其他语言,如果他们有很酷的东西)的答案感兴趣。

我正在用我继承的“使用 C# 语法的 C”代码中的多态替换 switch 语句。我一直在思考创建这些对象的最佳方法。我有两种我倾向于使用的后备方法。我想知道我是否应该考虑其他可行的替代方案,或者只是进行健全性检查,以确保我实际上正在以合理的方式解决这个问题。

我通常使用的技术:

  1. 使用无所不知的方法/类。此类将填充数据结构(很可能是 Map)或使用 switch 语句即时构建。
  2. 使用盲目类,该类使用配置文件和反射来创建实例/委托(delegate)/工厂/等的映射。然后以与上述类似的方式使用 map 。
  3. ???

有没有我应该强烈考虑的#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# - 逻辑现在是多态而不是开关,但是构造呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/633001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com