必会重构技巧:使用多态替换条件
使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象
举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型检查相关的程序段,如 if(type == typeof(TypeA)){...}else if(type == typeof(TypeB)){...},可以把{...}中的Code,尝试放到if的条件中去。然后通过检查Type就可以直接返回需要的东东了,这样做可以利用已有的继承层次进行计算,比较便于维护。如果还是觉得说的太抽象,可以看看下面的代码感觉一下。
项目实例:用WPF做一个网游的客户端Demo,里面需要对商品,邮件,物品栏做分页操作。于是手动写了几个分页的类。开始是把分页的计算方法都写在了事件里面的,每一个Button绑定一个事件,每次需要修改或者使用分页的时候,都要找到相关类进行修改,复制,各个方法的耦合程度大增,程序可读性,复用性和可维护性都不太好。虽然这个项目是很久之前做的了,但这里既然想起来了,觉得还是可以尝试用这种重构方法,效果如何大家自己看看吧。
先来看看原始的未经过重构的代码:
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
}
{
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。
{
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
必会重构技巧:使用多态替换条件相关推荐
- js 使用多态替换条件语句_用多态和组成替换多个条件
js 使用多态替换条件语句 用多态替换条件语句是一种众所周知的重构模式. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些 ...
- 重构——39以多态取代条件表达式(Replace Conditional with Polymorphism)
以多态取代条件表达式(Replace Conditional with Polymorphism) 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为:将这个条件表达式的每个分支放进一个子类内 ...
- 必会重构技巧(三):提取接口
提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖. 举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐 ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子-但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加到了 ...
- 重构手法——提炼函数、搬移函数、以多态取代条件表达式
目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...
- 代码重构技巧宝典,学透本篇就足够了!
本文来源:http://n5d.net/ma76k 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演进过程中,代码不停地在堆砌.如果没有人为代码的质量负责,代码总是会往越来越混乱的方向 ...
- 为什么要代码重构?如何重构?常见重构技巧,值得收藏!
>>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...
- 常见代码重构技巧(非常实用)
点击关注公众号,Java干货及时送达 作者:VectorJin juejin.cn/post/6954378167947624484 关于重构 为什么要重构 1_代码重构漫画.jpeg 项目在不断演 ...
- 设计原则与思想【面向对象、设计原则、编程规范、重构技巧】
一.高质量代码的评判标准: 可维护性:在不破化原有代码设计.不引入新的bug的情况下,能够快速的修改或者添加代码 可读性:我们需要看代码是否符合编码规范.命名是否达意.注释是否详尽.函数是否长短合适. ...
最新文章
- 按下电源后的几秒钟,CPU 在干嘛?
- 带领国产数据库走向世界,POLARDB底层逻辑是什么?
- python中正则表达式的使用
- iText操作Word工具类
- 阿德莱德计算机科学怎么样,阿德莱德大学计算机科学硕士专业怎么样?成为IT大牛的不二之选...
- 将android中如何调整Toast位置?
- Angular NgModule 作用域相关问题
- 半解TextBox灵异事件背后神秘的深度灵异事件
- 使用Macsome Audiobook Converter for Mac转换有声读物?
- CSS3属性选择器总结
- mysql-connector-java-5.1.22下载及安装
- json数据转换工具-js
- 【办公自动化】国土“三调”用地分类“一键”转南京分类
- 模拟退火算法(SA)
- python自动生成sql建表语句
- 修改iphone模拟器hosts
- Ubuntun 18.04 NVIDIA显卡驱动安装
- 阿里云开启ipv6通过appstore审核的方法
- Unity 自定义Package
- 联想拯救者Y7000系列黑苹果MacOS 12.3.1 Monterey详细安装教程记录