使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象

  举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型检查相关的程序段,如 if(type == typeof(TypeA)){...}else if(type == typeof(TypeB)){...},可以把{...}中的Code,尝试放到if的条件中去。然后通过检查Type就可以直接返回需要的东东了,这样做可以利用已有的继承层次进行计算,比较便于维护。如果还是觉得说的太抽象,可以看看下面的代码感觉一下。

  项目实例:用WPF做一个网游的客户端Demo,里面需要对商品,邮件,物品栏做分页操作。于是手动写了几个分页的类。开始是把分页的计算方法都写在了事件里面的,每一个Button绑定一个事件,每次需要修改或者使用分页的时候,都要找到相关类进行修改,复制,各个方法的耦合程度大增,程序可读性,复用性和可维护性都不太好。虽然这个项目是很久之前做的了,但这里既然想起来了,觉得还是可以尝试用这种重构方法,效果如何大家自己看看吧。
  先来看看原始的未经过重构的代码:

原始代码

//x:目标页数索引值 y:每页显示记录个数 这里不Care你是如何取到这几个值的和对这两个Int值合法性的验证
protected void btnFirstPage_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
repDataList.DataSource = Getdata(x,y); //Get Date from DB
}
}
protected void btnPrePage_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
repDataList.DataSource = Getdata(x, y); //Get Date from DB
}
}
protected void btnNextPage_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
repDataList.DataSource = Getdata(x, y); //Get Date from DB
}
}
protected void btnlastPage_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
repDataList.DataSource = Getdata(x, y); //Get Date from DB
}
}
private DataSet Getdata(int targetPageIndex, int numberPerPage) //Get Date from DB
{
throw new NotImplementedException(); //Here some code to retrive Data from DB
}

上面的几段代码可以实现功能,但是却存在以下几点问题。
(1)如果有多个页面需要使用分页,同样的代码需要复制多次,复用性差。
(2)第一个问题造成了第二个问题,如果需要修改某段方法,那所有的相关页面都要修改,可维护性差。
(3)相似逻辑的方法写在了多个事件中,可读性差。
为了解决这三个问题,现在重构后的代码如下:
重构后

public abstract class Paging
{
public int TargetPageIndex { get; set; }
public int NumberPerPage { get; set; }
public abstract DataSet DataList { get; }
}
public class FirstPage : Paging
{
public FirstPage(int targetPageIndex, int numberPerPage)
{
TargetPageIndex = targetPageIndex;
NumberPerPage = numberPerPage;
}
public override DataSet DataList
{
get
{
return Getdata(TargetPageIndex, NumberPerPage);
}
}
}
public class PrePage : Paging
{
public PrePage(int targetPageIndex, int numberPerPage)
{
TargetPageIndex = targetPageIndex;
NumberPerPage = numberPerPage;
}
public override DataSet DataList
{
get
{
return Getdata(TargetPageIndex, NumberPerPage);
}
}
}
public class NextPage : Paging
{
public NextPage(int targetPageIndex, int numberPerPage)
{
TargetPageIndex = targetPageIndex;
NumberPerPage = numberPerPage;
}
public override DataSet DataList
{
get
{
return Getdata(TargetPageIndex, NumberPerPage);
}
}
}
public class LastPage : Paging
{
public LastPage(int targetPageIndex, int numberPerPage)
{
TargetPageIndex = targetPageIndex;
NumberPerPage = numberPerPage;
}
public override DataSet DataList
{
get
{
return Getdata(TargetPageIndex, NumberPerPage);
}
}
}

以上代码可以独立出一个Paging的类,略加修改就可以对应任意的DataSource。

前台调用代码

protected void btnPaging_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn == null) return;
Paging page;
switch (btn.CommandArgument)
{
case "FirstPage":
page = new FirstPage(x,y);
repDataList.DataSource = page.DataList;
break;
case "PrePage":
page = new PrePage(x, y);
repDataList.DataSource = page.DataList;
break;
case "NextPage":
page = new NextPage(x, y);
repDataList.DataSource = page.DataList;
break;
case "LastPage":
page = new LastPage(x, y);
repDataList.DataSource = page.DataList;
break;

}
}

个人感觉,对于本例中的应用,好处并不是很明显,也许是我写的有问题,也许是我选择例子有问题。尽管如此,重构的思想体现出来了,那就是把算法封装到多态中。此种重构在对于含类型判断条件的复杂算法分支的应用上,效果还是比较显著的。

转载于:https://www.cnblogs.com/dongpo888/archive/2010/07/13/1776674.html

必会重构技巧:使用多态替换条件相关推荐

  1. js 使用多态替换条件语句_用多态和组成替换多个条件

    js 使用多态替换条件语句 用多态替换条件语句是一种众所周知的重构模式. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些 ...

  2. 重构——39以多态取代条件表达式(Replace Conditional with Polymorphism)

    以多态取代条件表达式(Replace Conditional with Polymorphism) 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为:将这个条件表达式的每个分支放进一个子类内 ...

  3. 必会重构技巧(三):提取接口

    提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖. 举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐 ...

  4. RefactoringGuru 代码异味和重构技巧总结

    整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子-但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加到了 ...

  5. 重构手法——提炼函数、搬移函数、以多态取代条件表达式

    目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...

  6. 代码重构技巧宝典,学透本篇就足够了!

    本文来源:http://n5d.net/ma76k 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演进过程中,代码不停地在堆砌.如果没有人为代码的质量负责,代码总是会往越来越混乱的方向 ...

  7. 为什么要代码重构?如何重构?常见重构技巧,值得收藏!

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  8. 常见代码重构技巧(非常实用)

    点击关注公众号,Java干货及时送达  作者:VectorJin juejin.cn/post/6954378167947624484 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演 ...

  9. 设计原则与思想【面向对象、设计原则、编程规范、重构技巧】

    一.高质量代码的评判标准: 可维护性:在不破化原有代码设计.不引入新的bug的情况下,能够快速的修改或者添加代码 可读性:我们需要看代码是否符合编码规范.命名是否达意.注释是否详尽.函数是否长短合适. ...

最新文章

  1. 按下电源后的几秒钟,CPU 在干嘛?
  2. 带领国产数据库走向世界,POLARDB底层逻辑是什么?
  3. python中正则表达式的使用
  4. iText操作Word工具类
  5. 阿德莱德计算机科学怎么样,阿德莱德大学计算机科学硕士专业怎么样?成为IT大牛的不二之选...
  6. 将android中如何调整Toast位置?
  7. Angular NgModule 作用域相关问题
  8. 半解TextBox灵异事件背后神秘的深度灵异事件
  9. 使用Macsome Audiobook Converter for Mac转换有声读物?
  10. CSS3属性选择器总结
  11. mysql-connector-java-5.1.22下载及安装
  12. json数据转换工具-js
  13. 【办公自动化】国土“三调”用地分类“一键”转南京分类
  14. 模拟退火算法(SA)
  15. python自动生成sql建表语句
  16. 修改iphone模拟器hosts
  17. Ubuntun 18.04 NVIDIA显卡驱动安装
  18. 阿里云开启ipv6通过appstore审核的方法
  19. Unity 自定义Package
  20. 联想拯救者Y7000系列黑苹果MacOS 12.3.1 Monterey详细安装教程记录

热门文章

  1. unix to linux,UNIX to Linux 的关键问题都有哪些?
  2. Visual Studio Code常用插件
  3. Delphi下利用WinIo模拟鼠标键盘详解
  4. debian手动安装java两种方法
  5. centos7安装配置pgAgent
  6. 五、DNS与bind
  7. PHP文件上传和文件操作案例
  8. iOS-UIWebView添加头部和尾部
  9. ArcGIS制图之Sub Points点抽稀
  10. 父域与子域之的信任关系