【问题标题】:Implementing a method to be invoked based on an a separate value实现基于单独值调用的方法
【发布时间】:2014-08-01 12:37:16
【问题描述】:

基于与该方法(的参数)不直接相关的变量运行方法的最佳方式是什么。

例如,如果我有一个接受 Json 或 XML 的输入,并且我希望根据输入的类型(XML 或 Json)使用正确的方法来解析这个输入,那么有哪些可能的方法呢?

一般我会这样实现:

StreamReader stream = new StreamReader(InputStream);
userInput= stream.ReadToEnd();

if (isJson(userInput))
{
    MethodA();
}
else
{
    MethodB();
}

但是我不喜欢这样做,因为我觉得它有点不成熟,宁愿只是这样做

StreamReader stream = new StreamReader(InputStream);
userInput= stream.ReadToEnd();

//get input type and invoke correct method automatically
Method();

让它自动决定使用哪个,我知道我可以用抽象类和覆盖做这样的事情,但是我不确定如何基于布尔值初始化它。这甚至可能吗?如果我有更多检查而不是 bool 来运行,例如,如果 string =="a" 执行此操作,如果 string == "b" 执行此操作,如果 string == "C" 执行此操作,如果 string == "D" 这样做。

我知道我可以使用某种形式的行动图来做到这一点,例如:

InputType inputType = getInputType(userInput);
Dictionary<InputType, Action> actionMap = new Dictionary<InputType, Action>();

actionMap.Add(InputType.Json, MethodA());
actionMap.Add(InputType.XML, MethodB());
actionMap.Add(InputType.Other, MethodC());

if (actionMap.ContainsKey(inputType))
{
   actionMap[inputType]();
}

但是我同样不太喜欢这种方式,还有什么其他的方式吗?我真的对人们认为正确/最有效/最先进的实现方式更感兴趣。

【问题讨论】:

  • 从概念上讲,您的问题的核心是您的第一个简单示例。当然,你可以用各种“成熟”的抽象来包装它,但是看看开始增长的不必要的复杂性。我会远离“最先进”的解决方案,争取一些简单易懂的东西,即使它不成熟。
  • 别想太多了 :) switch 语句可以优雅地满足需要。
  • 如果您只打算将 JSON 或 XML 作为输入类型,那么对于这样一个简单的场景来说,也许像其中一个答案中描述的优秀工厂方法这样更“优雅”的解决方案对于这样一个简单的场景来说太过抽象了(尽管我个人可能还是会这样做)。但是,如果您可以预见更多的输入类型,那么请务必选择更高级别的东西。
  • 是的,对于这样一个简单的真或假,if-else 似乎最合适,我只是在编码时很好奇,如果我有很多条件,是否有更优雅的方式来处理它。我将研究工厂方法,看看它是否适合我。谢谢大家!

标签: c# inheritance methods abstract


【解决方案1】:

您要求的是工厂方法。使用从字符串获得的布尔检查并不总是最好的。通过您选择的条件获取您想要的具体类,然后您只需要调用

factory.method()

查看此 wiki 以获得更多说明。

http://en.wikipedia.org/wiki/Factory_method_pattern

【讨论】:

  • 谢谢,我不知道这个,我会研究一下以备将来参考,干杯!
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多