【发布时间】: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