重构switch语句根据大小写分配不同的变量?

时间:2011-09-06 19:03:19

标签: c# refactoring

如何重构代码中多个位置的switch语句,该代码根据抛出的情况为变量赋值,例如:

int a = 0;
int b = 0;

switch(c)
{
   case "1"
      a = 1;
      break;
   case "2"
      b = 2;
      break;

}

在上面的例子中,resharper将使用其中一个变量作为return,另一个作为out参数。有没有其他方法可以做到,也许没有提取整个开关块。

2 个答案:

答案 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允许,你可以在上下文中向我们展示一个代码片段,这样可以更清楚地解决这个问题。