前几天,搬房子时又拿起《重构----改善既有代码的设计》这本书来随便翻来看下,重构Refactoring在开发时,是时常也经常会使用得到。

她确实教我们怎样把写程序写简洁,清楚 好明白,好理解,好维护......

今天为博客写点重构相关。以网友实际的例子,在论坛上看到的:

public void show2(string day)
{
string[] str = new string[] { "09:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00" };
for (int i = ; i < str.Length; i++)
{
string sql1 = "select position from cwsz where day='" + day + "' and sjd='" + str[i] + "'";
var dt1 = db.ExecuteQuery(sql1);
if (dt1.Rows.Count > )
{
if (dt1.Rows[]["position"] != null)
{
if (str[i] == "09:00")
{
if (dt1.Rows[]["position"].ToString() == "")
dropnine.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropnine.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropnine.SelectedIndex = ;
else
dropnine.SelectedIndex = ; }
if (str[i] == "10:00")
{
if (dt1.Rows[]["position"].ToString() == "")
dropten.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropten.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropten.SelectedIndex = ;
else
dropten.SelectedIndex = ;
}
if (str[i] == "11:00")
{
if (dt1.Rows[]["position"].ToString() == "")
dropele.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropele.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropele.SelectedIndex = ;
else
dropele.SelectedIndex = ;
}
if (str[i] == "12:00")
{
if (dt1.Rows[]["position"].ToString() == "")
droptw.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
droptw.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
droptw.SelectedIndex = ;
else
droptw.SelectedIndex = ;
}
if (str[i] == "13:00")
{
if (dt1.Rows[]["position"].ToString() == "")
tropthir.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
tropthir.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
tropthir.SelectedIndex = ;
else
tropthir.SelectedIndex = ;
}
if (str[i] == "14:00")
{
if (dt1.Rows[]["position"].ToString() == "")
dropfour.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropfour.SelectedIndex = ;
else if (dt1.Rows[]["position"].ToString() == "")
dropfour.SelectedIndex = ;
else
dropfour.SelectedIndex = ;
}
}
}
}
}

刚开始看到这段代码时,一眼看上去就发现用户写得很相同的代码,即是冗余。用了很多if...else...。这些都是在书所提及需要重构的问题点。

分几步来重构,先来解决代码冗余的部分,从if最内层开始,Insus.NET已经把不同的标记出来了,看下图:

把相同的代码写一个方法,以后一旦下拉列表的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

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

  1. 前端 javascript 写代码方式

    javascript 和python一样可以用终端写代码 写Js代码: - html文件中编写 - 临时,浏览器的终端 console  

  2. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

  3. 没有什么,开发ASP.NET时随便写写,想到什么写什么

    没有什么,开发ASP.NET时随便写写,想到什么写什么,这次想写点开发过程中,比如在数据库,某一张表中有一个字段,如下: 上面代码示例中高亮字段,数据类型为BIT,它存储的值将为"True& ...

  4. C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)

    由于iis的自动回收机制,不适用于ASP.NET程序 代码: using System; using System.Collections.Concurrent; using System.Confi ...

  5. 【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都 ...

  6. asp代码写的,微信会员报名转发分享带上下级和邀约人关系并且能微信支付asp编号的

    昨天晚上应一个客户要求写了一套代码,实现的功能是: 在微信公众号上注册会员,获取用户的头像和微信名称,进入会员中心报名,报名成功成功后,他如果转发链接给别人,别人打开后则成为他的下级,上面那个算是一个 ...

  7. MySQL 创始人:写代码比打游戏爽,程序员应多泡开源社区

     王练 发布于2017年09月04日 收藏 43   开源中国全球专享福利,云栖大会购票大返现!>>>   根据StackOverflow的最新调查,MySQL仍然是全世界最流行的数 ...

  8. CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写

    互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...

  9. NX二次开发-NX+VS写代码设断点调试技巧

    在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对. ...

随机推荐

  1. git常用命令-基本操作

    git常用命令-基本操作 1)      新增文件 新增了Test_1.java git add Test_1.java git commit –m “新增了Test_1.java” git push ...

  2. OGG-03517 Conversion from character set failed解决方法

    用goldengate同步oracle数据到mysql,由于一个字段某行数据的字段集的原因导致 replicat进程报 OGG-03517错 OGG-03517  Conversion from ch ...

  3. config中自定义配置

    1. 定义自己的KeyValue <section name="TestKeyValue" type="System.Configuration.NameValue ...

  4. 使用python pylab库 画线

    pylab 提供了比较强大的画图功能,但是函数和参数都比较多,很容易搞混.我们平常使用最多的应该是画线了.下面,简单的对一些常用的划线函数进行了封装,方便使用. # -*- coding: utf-8 ...

  5. 解决Visual Studio 2010新建工程时出现『1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt』错误

    VS2010在经历一些更新后,建立Win32 Console Project时会出"error LNK1123" 错误.   解决方案为: 第一步:将:项目|项目属性|配置属性|清 ...

  6. SLAM中的EKF,UKF,PF原理简介

    这是我在知乎上问题写的答案,修改了一下排版,转到博客里.   原问题: 能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 目前SLAM后端都开始用优化的方法来做,题主想要了解一下之前基于 ...

  7. 华为手机连不上adb解决方法

    1.关闭qq,豌豆荚等一连接usb自动侦测手机的程序... 2.安装hisuite软件,这个应该跟相应的版本有关,新版本最好要安装这个软件,否则也可能导致怎么都连接不上 3.打开usb调试功能 4.a ...

  8. oracle 11g 如何创建、修改、删除list-list组合分区

    Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区.系统分区.INTERVAL分区等功能. 9i开始,Oracle就包括了2种复合分区,RANGE-HASH和R ...

  9. 动态密码卡TOTP算法

    TOTP NET实现:http://googleauthcsharp.codeplex.com/ 引用:http://www.cnblogs.com/wangxin201492/p/5030943.h ...

  10. Android studio动态调试smali

    前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会.   0x01 ...