如何重构代码中多个位置的switch语句,该代码根据抛出的情况为变量赋值,例如:
int a = 0;
int b = 0;
switch(c)
{
case "1"
a = 1;
break;
case "2"
b = 2;
break;
}
在上面的例子中,resharper将使用其中一个变量作为return,另一个作为out参数。有没有其他方法可以做到,也许没有提取整个开关块。
答案 0 :(得分:2)
这个代码块有几种不同的重构方法,可以让它更容易重复使用,而不会在某些地方复制它。但是,他们需要重新制作东西:
对象是否以某种方式进行逻辑分组?
如果是这样,那么你可以创建一个对象来表示它们,然后重构以返回带有值的对象集。
var myObj = SetObjectAccordingTo(c);
protected SomeObj SetObjectAccordingTo(string c)
{
var myObj = new SomeObj();
switch(c)
{
case "1": myObj.a = 1;
break;
case "2": myObj.b = 2;
break;
}
return myObj;
}
如果它们没有逻辑分组,则每个分配一个值......
然后需要分割用于确定每个值的逻辑。
a = DetermineValueForA(c);
b = DetermineValueForB(c);
每种方法仅涉及涉及a的情况。
如果它们没有逻辑分组,并且只分配了某些值......
然后,除了将各个值移动到成员变量然后使用该特定方法调用每个值之外,没有太多可以执行的优化。
如果您可以提供您尝试做的样本,我们可能会提供更多可能的解决方案。
答案 1 :(得分:1)
你的意思是你想把它作为一种方法提取出来?如果A和B以某种方式相关,您可以考虑返回结构(或者可能是类)。也许,NDA允许,你可以在上下文中向我们展示一个代码片段,这样可以更清楚地解决这个问题。