自己看了好多重构的方法,但是仍然无法理解的彻底。例如这段代码怎么去除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();
}
看了好多博客,说的是用反射+多态。可是我的这些都会,就是连起来不知道怎么使用了??
求解答
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();
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(); }
这个数据本来就是前台给我的,我的想法是让前台压根不知道的情况下,我后台去除switch语句,用委托确实可以,逻辑就不要交给前台去处理了吧
也就是前台代码一点不动,还是调用这个方法,传递这个参数,
不丑陋啊.这种代码有啥丑的.
有些业务是可以优化的.有些没啥好优化.
要看实际情况.比如你这个视图查找.如果是普遍的业务.比如移动端访问返回移动端视图.pc段返回pc的视图.这种普遍的逻辑.
可以重写视图查找规则.
但是这样不是违背了开放封闭原则了吗
@青静: 恕臣直言:没看出来这里哪里和开放封闭原则有关系.
能好看点就是:
switch (status) { case 2: return View("PersonalBlogPage"); case 0: case 3: return View("Create", applyBlog); case 1: default: return View(); }
@吴瑞祥: 如果说有status有一个另外的值,代表不同的含义,你是不是要在switch中添加一个case语句
@青静: 是的. 话说这个代码是会出现多次吗?你这么纠结.
@吴瑞祥: 这不是很多次的问题,这是为了以后做准备
@吴瑞祥: 为了以后的修改更加的方便
@青静: 如果只有这一处.那你弄复杂了.以后修改只会更麻烦.还是好好sw吧.嫌难看你可以把他放到一个方法里.
参数status返回view
方法好多,但也不见得就咋的啊,
比如定义一个dictionary或者数组、LIST啥的, KEY是status, Value是Object
你这就可以变成类似这样
var q= from c in list
where c.key=status
select c.obj
return obj
高明,多谢