`
aspnetwinform
  • 浏览: 89904 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

31天重构学习笔记31. 使用多态代替条件判断

 
阅读更多

摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年 10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整个系列并没有多少感觉,因为这些基本上项目都在使用,只是我们没有专门把它标示和整理出来,所以也没有引起多大的重视。现在突然接手这个重构项目,由于团队成员技术和经验参差不齐,所以有必要专门整理一个重构的纲要,当然这个系列也非常适合做新系统的代码规范参考,只要有代码的地方,这个重构规范就很有价值。周末也不想出去闲逛,因为在刚到这个美丽的城市,没有亲戚或者朋友,所以才能静下心来两天时间写完这个重构参考规范。同时也感受了Windows Live writer写文章的快感。当然重构的整体架构得另当别论(整体架构在我的这篇文章有专门的讲解(http://www.cnblogs.com/zenghongliang/archive/2010/06/23/1763438.html)。大的架构设计好了以后,这些重构细节点就成了东风之后的大火,对整个项目也是至关重要。31天重构这个系列和《代码大全》、《重构:改善既有代码的设计》比较起来最大的特点就是比较简单、浅显易懂。那么我这些文章也都是学习Sean Chambers的31天重构的笔记整理,所以如果大家对这个笔记有任何异议也可以指出。

具体也可以通过http://www.lostechies.com/blogs/sean_chambers/archive/2009/07/31/31-days-of-refactoring.aspx查看原文。

概念:本文中的”使用多态代替条件判断”是指如果你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用。

正文:本文展示了面向对象编程的基础之一“多态性”, 有时你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用。

如下代码所示,OrderProcessor 类的ProcessOrder方法根据Customer 的类型分别执行一些操作,正如上面所讲的那样,我们最好将OrderProcessor 类中这些算法(数据或操作)封装在特定的Customer 子类中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;

namespace LosTechies.DaysOfRefactoring.SampleCode.ReplaceWithPolymorphism.Before
{
public abstract class Customer
{
}

public class Employee : Customer
{
}

public class NonEmployee : Customer
{
}

public class OrderProcessor
{
public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
{
// do some processing of order
decimal orderTotal = products.Sum(p => p.Price);

Type customerType = customer.GetType();
if (customerType == typeof(Employee))
{
orderTotal -= orderTotal * 0.15m;
}
else if (customerType == typeof(NonEmployee))
{
orderTotal -= orderTotal * 0.05m;
}

return orderTotal;
}
}
}

重构后的代码如下,每个Customer 子类都封装自己的算法,然后OrderProcessor 类的ProcessOrder方法的逻辑也变得简单并且清晰了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;

namespace LosTechies.DaysOfRefactoring.SampleCode.ReplaceWithPolymorphism.After
{
public abstract class Customer
{
public abstract decimal DiscountPercentage { get; }
}

public class Employee : Customer
{
public override decimal DiscountPercentage
{
get { return 0.15m; }
}
}

public class NonEmployee : Customer
{
public override decimal DiscountPercentage
{
get { return 0.05m; }
}
}

public class OrderProcessor
{
public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
{
// do some processing of order
decimal orderTotal = products.Sum(p => p.Price);

orderTotal -= orderTotal * customer.DiscountPercentage;

return orderTotal;
}
}
}

总结: ”使用多态代替条件判断“这个重构在很多时候会出现设计模式中(常见的工厂家族、策略模式等都可以看到它的影子),因为运用它可以省去很多的条件判断,同时也能简化代码、规范类和对象之间的职责。

分享到:
评论

相关推荐

    .archivetemp多态笔记.md

    .archivetemp多态笔记.md

    class.cpp多态虚函数的演示课设

    多态虚函数的运行演示

    基于多态的职工管理系统

    功能包括: 1.增加职工信息 2.显示职工信息 3.删除离职职工 4.修改职工信息 5.查找职工信息 ...1.多态的使用 2.抽象类的使用 3.文件读写 4.二重指针数组 5.虚函数的使用 6.动态多态的应用 7.继承与面向对象的使用

    Java-多态--学习笔记.docx

    1. **多态应用**:多态性允许我们使用一个类型的引用指向它的子类型实例,这样在调用相同的方法时,会根据实际的对象类型执行不同的操作。这种现象在程序设计中非常常见,例如在处理不同类型的动物时,虽然都具有...

    C++学习笔记......

    本学习笔记将深入探讨C++的基础、核心概念以及高级特性,帮助读者从初学者到熟练掌握C++。 一、C++基础 C++的基础包括基本语法、数据类型、变量、运算符、流程控制(如if语句、switch语句、for循环、while循环)和...

    C++之多态实现机制剖析

    在C++编程语言中,多态(Polymorphism)是一种核心特性,它允许我们使用一个接口来表示多种不同的类型,增强了代码的灵活性和可扩展性。多态的实现主要依赖于虚函数(Virtual Functions)和纯虚函数(Pure Virtual ...

    论文研究-多态交通条件下交叉口定时控制延误模型.pdf

    论文研究-多态交通条件下交叉口定时控制延误模型.pdf, 延误是评价交叉口服务水平的基本指标, 延误模型对交叉口信号控制方案的选择意义重大. 在多态交通条件下, 采用现有...

    Python 109.多态.mp4

    Python 109.多态.mp4

    CPP.rar_多态 .cpp

    在C++编程语言中,多态(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许我们使用一个接口来表示多种不同的类型,为程序...学习并掌握多态,将有助于编写出更加高效、灵活的C++程序。

    多态和接口学习笔记

    在Java编程语言中,多态(Polymorphism)和接口(Interface)是两个核心概念,它们对于理解和构建面向对象程序至关重要。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。接口则提供了类之间的抽象连接...

    python学习笔记,作业.zip

    2. 控制结构:Python提供了if-else语句、for循环、while循环等控制流程结构,用于执行条件判断和重复操作。 3. 函数:Python中函数定义使用def关键字,可以接收参数并返回值。内置函数如len()、type()、print()等...

    1.多态含义和注意.mp4

    1.多态含义和注意.mp4

    1.继承的本质和原理 2.派生类的构造类型 3.重载、覆盖、隐藏 4.静态绑定和动态绑定 5.多态 vfptr和vftbale

    1.继承的本质和原理 2.派生类的构造类型 3.重载、覆盖、隐藏 ...5.多态 vfptr和vftbale 6.抽象类的设计原理 7.多继承以及问题 8.虚基类 vbptr和vbtable 9.RTTI 10.C++四种类型强转 11.继承多态常见笔试面试题分享

    CPP.rar_多态 .cpp_继承与多态_继承与多态C++

    标题中的"CPP.rar_多态 .cpp_继承与多态_继承与多态C++"表明这个压缩包文件包含了关于C++编程语言中多态性(Polymorphism)和继承(Inheritance)的概念示例。多态性和继承是面向对象编程(Object-Oriented ...

    P135~142C++类和对象多态学习笔记.docx

    C++ 类和对象多态学习笔记 本节笔记主要介绍了 C++ 中的多态概念,包括静态多态和动态多态,及其使用条件和优点。 多态是 C++ 面向对象三大特性之一,分为两类:静态多态和动态多态。静态多态是指函数重载和运算符...

    java.多态(处理方案示例).md

    java.多态(处理方案示例).md

    Java基础精品课11-多态录屏5.多态调用演示.mp4

    Java基础精品课11-多态录屏5.多态调用演示.mp4

    软件设计师考试经验+软考历年真题(2004—2009上午加下午共24套)2.doc

    包含多态 B.参数多态 C.过载多态 D.强制多态 (2)A.具体对象无关 B.具体类型无关 C.具体对象相关 D.具体类型相关 (3)A.具体对象无关 B.具体类型无关 C.具体对象相关 D.具体类型相关 ● __(4)__的特点是...

    31天 重构速成 pdf

    4. **多级条件语句转换为多态(Replace Conditional with Polymorphism)**:如果在一个方法中有复杂的条件判断逻辑,可以考虑使用面向对象的多态特性来简化代码。 ### 如何快速提升重构能力 1. **学习重构模式**...

    31天代码重构快速优化代码

    《31天重构速成》系列文章提供了31个具体的重构技巧,帮助开发者逐步掌握这一关键技能。 **重构的必要性** 1. **避免代码遗忘**:随着时间推移,开发者可能会忘记代码的具体功能,重构可以帮助保持代码清晰,降低...

Global site tag (gtag.js) - Google Analytics