开发(ASP.NET程序)把写代码写至最有面向对象味道

今天看了条博文,瞬间又勾起了对设计模式的兴趣。虽然掌握的不多,但看一个学一个总归是好的。一下是文章中的内容和整理。

首先看原始代码

 1 public void show2(string day)
 2     {
 3         string[] str = new string[] { "09:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00" };
 4         for (int i = 0; i < str.Length; i++)
 5         {
 6             string sql1 = "select position from cwsz where day=‘" + day + "‘ and sjd=‘" + str[i] + "‘";
 7             var dt1 = db.ExecuteQuery(sql1);
 8             if (dt1.Rows.Count > 0)
 9             {
10                 if (dt1.Rows[0]["position"] != null)
11                 {
12                     if (str[i] == "09:00")
13                     {
14                         if (dt1.Rows[0]["position"].ToString() == "3")
15                             dropnine.SelectedIndex = 1;
16                         else if (dt1.Rows[0]["position"].ToString() == "4")
17                             dropnine.SelectedIndex = 2;
18                         else if (dt1.Rows[0]["position"].ToString() == "5")
19                             dropnine.SelectedIndex = 3;
20                         else
21                             dropnine.SelectedIndex = 4;
22
23                     }
24                     if (str[i] == "10:00")
25                     {
26                         if (dt1.Rows[0]["position"].ToString() == "3")
27                             dropten.SelectedIndex = 1;
28                         else if (dt1.Rows[0]["position"].ToString() == "4")
29                             dropten.SelectedIndex = 2;
30                         else if (dt1.Rows[0]["position"].ToString() == "5")
31                             dropten.SelectedIndex = 3;
32                         else
33                             dropten.SelectedIndex = 4;
34                     }
35                     if (str[i] == "11:00")
36                     {
37                         if (dt1.Rows[0]["position"].ToString() == "3")
38                             dropele.SelectedIndex = 1;
39                         else if (dt1.Rows[0]["position"].ToString() == "4")
40                             dropele.SelectedIndex = 2;
41                         else if (dt1.Rows[0]["position"].ToString() == "5")
42                             dropele.SelectedIndex = 3;
43                         else
44                             dropele.SelectedIndex = 4;
45                     }
46                     if (str[i] == "12:00")
47                     {
48                         if (dt1.Rows[0]["position"].ToString() == "3")
49                             droptw.SelectedIndex = 1;
50                         else if (dt1.Rows[0]["position"].ToString() == "4")
51                             droptw.SelectedIndex = 2;
52                         else if (dt1.Rows[0]["position"].ToString() == "5")
53                             droptw.SelectedIndex = 3;
54                         else
55                             droptw.SelectedIndex = 4;
56                     }
57                     if (str[i] == "13:00")
58                     {
59                         if (dt1.Rows[0]["position"].ToString() == "3")
60                             tropthir.SelectedIndex = 1;
61                         else if (dt1.Rows[0]["position"].ToString() == "4")
62                             tropthir.SelectedIndex = 2;
63                         else if (dt1.Rows[0]["position"].ToString() == "5")
64                             tropthir.SelectedIndex = 3;
65                         else
66                             tropthir.SelectedIndex = 4;
67                     }
68                     if (str[i] == "14:00")
69                     {
70                         if (dt1.Rows[0]["position"].ToString() == "3")
71                             dropfour.SelectedIndex = 1;
72                         else if (dt1.Rows[0]["position"].ToString() == "4")
73                             dropfour.SelectedIndex = 2;
74                         else if (dt1.Rows[0]["position"].ToString() == "5")
75                             dropfour.SelectedIndex = 3;
76                         else
77                             dropfour.SelectedIndex = 4;
78                     }
79                 }
80             }
81         }
82     }

这篇代码有太多的if..else ,首先我们想到的是switch来优化,如图:

把相同的代码写一个方法,以后一旦下拉列表的SelectedIndex的维护,只来这个方法修改即可,不必去每一个if内检查,或是查找替换。

然后我们就可以去修改上抽离的代码,Insus.NET把重构部分comment掉:

现在我们把comment的代码删除,变成下面这个样子,代码简洁多了:

但是上面经首次重构之后,if还是太多,学习过设计模式的话,看到这部分程序,自然想起使用《设计模式--中介(Mediator)模式http://www.cnblogs.com/insus/p/4134383.html 中介者模式来解决。只管传入str[i]值进去即可,用户不必明白它是怎样处理与判断,达到封装效果:

运用设计模式来进行重构:

最后一个private int SetSelectIndex(string position)方法,我们也把它移至中介者类别中去了:
所留给用户看到的代码,即是(删除comment):

以面向对象编程来说,上面高亮两行代码,应该它来自一个对象,不管你的程序是使用存储过程还是写SQL语句,我们尽量不要出现在xxx.aspx.cs代码页中:

这样子,在xxx.aspx.cs代码,就可以改为:

现在我们回过头去看中介者SwitchObject类,它最底的私有方法,其实使用了switch方法,在重构之中,也是一个很坏的使用。其实switch即是替代多个if判断。出现多个if时,我们又可以使用中介者模式来解决。

创建一个中介者类:

再来看看Insus.NET怎样对SwitchObject类修改:

重构到这里,整段程序也改得差不多了,但是在SwitchObject类中,还是有些代码是很不稳定的。有可能常被修改,因此,我们还是把它移走。只留下稳定代码:

移到哪里,Insus.NET想把它移至最原始的位置,在移动之前Select()方法,需要小修改一下,期望传入另外一个参数:

回至xxx.aspx.cs的 public void show2(string day)方法:

重构到这里,你还是看到有一个if判断:

似乎改得有点问题,正确来说,当传入的position为空时,它等于4。而不是获取的selectedIndex不等于4时等于4。

重构完毕,最终源程序可从下面链接下载:
http://download.cnblogs.com/insus//Refactoring/RefactoringAndMediator_pattern.rar

最后,原文网址:http://www.cnblogs.com/insus/p/4139346.html (支持下正版)

时间: 2025-01-11 08:05:29

开发(ASP.NET程序)把写代码写至最有面向对象味道的相关文章

★★★★★★★★★★★★★★★★★★啊好烦,写代码写的要吐血了哦

全数字好域名疯狂抢99%成功率|域名注册|已备案未注册|到期删除过期域名查询|-尽在(爱酷名_ikuMing.com) 啊好烦,写代码写的要吐血了哦 写代码真的好痛苦啊,快坚持不下去了,谁来拯救我一下哦

我在北京写代码 写出心中悲与喜 写出人间的悲欢离合 欢迎阅读 我的第三章 使用集合组织相关数据(泛型集合)

ArrayList arry = new ArrayList();            arry.Add("小明");            arry.Add("小D");            arry.Add("小B");            arry.Insert(2,"小狗");            arry.Remove("小狗");            arry.RemoveAt(0);

厌倦写代码的人是如何做软件开发的

我,一个三十四岁的中年大叔.撸码十多年,从C++到C#,从CS到BS.睡觉的时候都会梦到"缺少对象"."undefined"."Failed to load resource".以前不做BS开发还好,用到的技术还少一点.现在不得了了,javascript.css.ajax.C#.python.java.sqlsever.oracle.mysql.反正作为一个程序猿注定就是苦难的一生.以前还有人说转型啊,转管理啊,管理不还是得管程序员,一帮菜逼小弟

关爱码农成长:关于写代码二三事

工作这么多年以来,一直从事软件相关领域,即使担任主管职务,也一直对技术充满热情.写代码写了这么多年,多少有些体会.我把自己对写代码这份工作的心得写下来,希望能给从事相关领域或有志于写代码的人参考. 一.你适合当程序员吗? 程序员,也叫软件工程师.程序设计师,我觉得「程序员」三个字简洁有力,是一种身份的象征. 如果你正从事这份工作,恭喜你!这是个热门行业,在可预见的将来,也不会消失.不过也别高兴太早,这一行的技术汰旧换新非常快,必须不断努力学习才行. 一点天赋 打开一个空白文档,必须创造出代码.与

CTO集体怒吼:我到底要不要继续写代码(下篇)

注:承接上文,CTO们就从哪些方面确定产品和技术布局大方向,目前面临的困惑,以及作为CTO的技术修炼等方面进行探讨.上篇:CTO集体怒吼:我到底要不要继续写代码(上篇) 5.在人人创业的时代里,竞争压力非常大.有很多产品,甚至会有多个竞争对手,那么产品技术和布局会非常重要.CTO从哪些方面确定大的方向? 肖文峰(TalkingData):人员成本水涨船高,尽早储备人才. 多深多远还是回到CTO对于公司未来的愿景理解的多深.根据愿景储备人才.尤其是创业初期,大家知道人才是很贵的,比如研发人员,尤其

CTO集体怒吼:我到底要不要继续写代码!

以下是6位发疯的CTO,在一起讨论人生.命运.创业.工作时,发出的怒吼: 休息跟生活是一样的,基本上每天是工作到晚上12点. 我应聘去说我会做软件,人家不要我. 我为什么成为CTO?到现在还有一点莫名其妙的感觉. 研究技术是自己的娱乐,但是把技术转化为产品这是一个工作. 我经常调侃说"我是做技术里数据最好的,数据里产品最好的". 跟我老婆要求的方向越来越偏差了,她是希望我能陪孩子.怎么办呢?招聘.但是现在要找到一个38岁的老男人,做过这样的事情,也很难,人家也肯定也有家庭. 我到底要不

CTO集体怒吼:我到底要不要继续写代码!(上)

CTO集体怒吼:我到底要不要继续写代码!(上) 以下是6位发疯的CTO,在一起讨论人生.命运.创业.工作时,发出的怒吼: 休息跟生活是一样的,基本上每天是工作到晚上12点. 我应聘去说我会做软件,人家不要我. 我为什么成为CTO?到现在还有一点莫名其妙的感觉. 研究技术是自己的娱乐,但是把技术转化为产品这是一个工作. 我经常调侃说"我是做技术里数据最好的,数据里产品最好的". 跟我老婆要求的方向越来越偏差了,她是希望我能陪孩子.怎么办呢?招聘.但是现在要找到一个38岁的老男人,做过这样

养成良好的写代码习惯

看了上一节hello world一篇,相信你对C语言语法结构有了一定感触,其实基本上每个C语言程序代码都是那样的声明,那样的框架,而要填充的内容就是框架内的内容.会了hello world,其他的也就可以融会贯通,只不过是学习新的语句新的函数,新的算法的问题.所以在你写代码写的很6之前,我要讲一节习惯的问题.就是写代码的习惯. 为什么要养成好的写代码的习惯?因为你的代码并不只是要求能运行,还要美观易读.有可读性的代码才是有价值的代码,如果你写完代码,别人根本看不懂,甚至你自己都看不懂,那么这个代

如果40岁了还在写代码,是一种幸福,还是一种悲哀?

今天突然想到一个问题:如果40岁了还在写代码,是怎样的状态? 然后搜了一下,果然已经有人想到了,我们先来看看知乎的神人回答. 曾经有网友在知乎提问:"如果 40 岁了还在写代码,是一种幸福,还是一种悲哀?请考虑国情,别老拿外国作比方." 下面是其他一些知乎网友的回复: 马上就 40 了,依然在写代码,写各种代码,从C/C++写到 object-c,从 java 写到 lua,乐在其中,享受得很. 当然,我现在基本不是依靠写代码挣钱谋生,事实上,我也几乎也没有纯粹依赖过写代码谋生过.写代