• 开发(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     }
    View Code

    这篇代码有太多的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 (支持下正版)

  • 相关阅读:
    iOS开发JSON文件解析数据成Model的过程简单介绍
    ios 开发中 --做登陆注册时编译出现的错误和解决方法
    iOS 开发 SMSSDK-免费短信获取的实现方法
    IOS 设计 面试题及答案
    Cycle (KMP + hash)
    ATM Mechine (概率DP)
    Bubble Sort (找规律)
    The All-purpose Zero (最长公共子序列)
    Substring (后缀数组 + 计数)
    Lucky 7 (容斥原理 + 中国剩余定理)
  • 原文地址:https://www.cnblogs.com/ajunForNet/p/4145385.html
Copyright © 2020-2023  润新知