首页 新闻 搜索 专区 学院

怎么通过重构去除丑陋的switch语句

0
悬赏园豆:20 [已解决问题] 解决于 2017-04-20 11:39

自己看了好多重构的方法,但是仍然无法理解的彻底。例如这段代码怎么去除switch语句

switch (status)
{
case 0:
return View("Create", applyBlog);
case 1:
return View();
case 2:
return View("PersonalBlogPage");
case 3:
return View("Create", applyBlog);
default:
return View();
}

 

看了好多博客,说的是用反射+多态。可是我的这些都会,就是连起来不知道怎么使用了??

求解答

Bluto的主页 Bluto | 菜鸟二级 | 园豆:317
提问于:2017-04-20 09:49
< >
分享
最佳答案
0
class  Response{ 

  public void View(){    

  }

}

View0 extends Response{

  string str0 = "Create";

  string applyBlog;

  public void View(){

       str0 = "done";

     applyBlog = "done too";

  }

View1 extends Response{ 

  public void View(){    

    //do something...

  }

}

View2 extends Response{

  string str2 = "PersonalBlogPage";

  

public void View(){

       ComFun.Dosomething(str2);

    //do something...

  } 

}

 

/* 反射,通过类的名字 */

Class c = Class.forName("View"+status);

/* 实例化对象 */

Response r = (Response) c.newInstance();

/* 多态完成具体的View()调用 */

r.View();
收获园豆:10
codingHeart | 小虾三级 |园豆:1511 | 2017-04-20 10:19
其他回答(3)
0
static void Main(string[] args)
       {
          Console.WriteLine(Exec(GetSet));
          Console.ReadKey();
       }
       //定义委托,用于将方法做为参数传给Exec.
       public delegate string GetResultDelegate();
       public static string Get()
       {
           return "get";
       }
  
       public static string GetTest()
       {
           return "gettest";
       }
  
       public static string GetSet()
       {
           return "getSet";
       }
  
  
       public static string Exec(GetResultDelegate getResult)
       {
           return getResult();
       }
收获园豆:2
hahanonym | 园豆:1460 (小虾三级) | 2017-04-20 09:59

这个数据本来就是前台给我的,我的想法是让前台压根不知道的情况下,我后台去除switch语句,用委托确实可以,逻辑就不要交给前台去处理了吧

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 10:06

也就是前台代码一点不动,还是调用这个方法,传递这个参数,

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 10:07
0

不丑陋啊.这种代码有啥丑的.

有些业务是可以优化的.有些没啥好优化.

要看实际情况.比如你这个视图查找.如果是普遍的业务.比如移动端访问返回移动端视图.pc段返回pc的视图.这种普遍的逻辑.

可以重写视图查找规则.

吴瑞祥 | 园豆:28841 (高人七级) | 2017-04-20 10:06

但是这样不是违背了开放封闭原则了吗

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 10:18

@青静: 恕臣直言:没看出来这里哪里和开放封闭原则有关系.

能好看点就是:

switch (status)
{ 
  case 2:
    return View("PersonalBlogPage");
  case 0:
  case 3:
    return View("Create", applyBlog);
  case 1:
  default:
    return View();
}
支持(0) 反对(0) 吴瑞祥 | 园豆:28841 (高人七级) | 2017-04-20 10:21

@吴瑞祥: 如果说有status有一个另外的值,代表不同的含义,你是不是要在switch中添加一个case语句

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 11:36

@青静: 是的. 话说这个代码是会出现多次吗?你这么纠结.

支持(0) 反对(0) 吴瑞祥 | 园豆:28841 (高人七级) | 2017-04-20 11:41

@吴瑞祥: 这不是很多次的问题,这是为了以后做准备

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 11:42

@吴瑞祥: 为了以后的修改更加的方便

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 11:43

@青静: 如果只有这一处.那你弄复杂了.以后修改只会更麻烦.还是好好sw吧.嫌难看你可以把他放到一个方法里.

参数status返回view

支持(0) 反对(0) 吴瑞祥 | 园豆:28841 (高人七级) | 2017-04-20 11:45
0

方法好多,但也不见得就咋的啊,

比如定义一个dictionary或者数组、LIST啥的, KEY是status, Value是Object

你这就可以变成类似这样

var q= from c in list

             where c.key=status

            select c.obj

 

return obj

收获园豆:8
爱编程的大叔 | 园豆:30698 (高人七级) | 2017-04-20 10:13

高明,多谢

支持(0) 反对(0) Bluto | 园豆:317 (菜鸟二级) | 2017-04-20 10:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册