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

标签 c# design-patterns oop

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

我正在用我继承的“C using 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# - 逻辑现在是多态而不是 Switch,但是构造呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/633001/

相关文章:

c# - 在 asp.net 控件中访问全局资源

c# - 读取 ASN.1 DER 编码的 RSA 公钥

c# - 区分抛出的 SqlException

c# - 使用 studio 2012 构建后的任务序列化问题

c# - 向类中的每个方法添加方法调用

design-patterns - 依赖注入(inject)和单例设计模式

python - 实现 "diamond inheritance"的 Pythonic 方式是什么?

java - 用于管理大型操作结果的设计模式

java - OO游戏设计题

php - 将 mysql 结果 $row 传递给类中的另一个方法