重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)

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

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

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

 1 public abstract class Customer
 2     {
 3     }
 4
 5     public class Employee : Customer
 6     {
 7     }
 8
 9     public class NonEmployee : Customer
10     {
11     }
12
13     public class OrderProcessor
14     {
15         public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
16         {
17             // do some processing of order
18             decimal orderTotal = products.Sum(p => p.Price);
19
20             Type customerType = customer.GetType();
21             if (customerType == typeof(Employee))
22             {
23                 orderTotal -= orderTotal * 0.15m;
24             }
25             else if (customerType == typeof(NonEmployee))
26             {
27                 orderTotal -= orderTotal * 0.05m;
28             }
29
30             return orderTotal;
31         }
32     }

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

 1 public abstract class Customer
 2     {
 3         public abstract decimal DiscountPercentage { get; }
 4     }
 5
 6     public class Employee : Customer
 7     {
 8         public override decimal DiscountPercentage
 9         {
10             get { return 0.15m; }
11         }
12     }
13
14     public class NonEmployee : Customer
15     {
16         public override decimal DiscountPercentage
17         {
18             get { return 0.05m; }
19         }
20     }
21
22     public class OrderProcessor
23     {
24         public decimal ProcessOrder(Customer customer, IEnumerable<Product> products)
25         {
26             // do some processing of order
27             decimal orderTotal = products.Sum(p => p.Price);
28
29             orderTotal -= orderTotal * customer.DiscountPercentage;
30
31             return orderTotal;
32         }
33     }
时间: 2024-10-28 16:24:31

重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)的相关文章

简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)

你手上一个条件表达式,它根据对象类型的不同而选择不同的行为.将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数. 动机:多态的最根本的好处是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写某些的条件表达式. 正因为有了多态,所以你会发现:“类型吗的switch语句”以及 ”基于类型名称的if-then-else语句“在面向对象程序中很少出现. 多态能够给你带来很多好处.如果同一组条件表达式在程序的许多地点出现,那么使用多态的收益是最大的.使用条件表达

重构第四天 : 用多态替换条件语句(if else &amp; switch)

面相对象的一个核心基础就是多态,当你要根据对象类型的不同要做不同的操作的时候,一个好的办法就是采用多态,把算法封装到子类当中去. 重构前代码: 1 public abstract class Customer 2 { 3 } 4 5 public class Employee : Customer 6 { 7 } 8 9 public class NonEmployee : Customer 10 { 11 } 12 13 public class OrderProcessor 14 { 15

编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存在两个命令:开始.停止.又假设有一个驾驶方法可以处理车辆接收到的指令.一开始我们可能像下面这样编码: static void Main(string[] args) { DriveCommand command = DriveCommand.Start; Drive(command); comman

利用反射+多态替换条件语句

/*利用反射+多态替换条件语句*/ class Program { public static void Main(string[] args) { /* * 用户发送一个命令,让代码去指定Commander * * <?xml version="1.0" encoding="utf-8" ?><Command><CommandType>Start</CommandType></Command> */ //

JavaScript基本语法 -- 条件语句 &amp; 循环语句

条件语句 条件语句(Conditional statement)是JavaScript里面的基本结构之一,程序根据表达式的真假决定执行或者跳过某个分支,于是,条件语句有时候也可以称为"分支语句" 1. if & else if & else 基本写法如下: if (表达式1) { // 如果表达式1为真,执行代码块1 代码块1 } else if (表达式2) { // 如果表达式2为真,执行代码块2 代码块2 } else { // 否则,执行代码块3 代码块3 }

小酌重构系列[14]——使用多态代替条件判断

概述 有时候你可能会在条件判断中,根据不同的对象类型(通常是基类的一系列子类,或接口的一系列实现),提供相应的逻辑和算法.当出现大量类型检查和判断时,if else(或switch)语句的体积会比较臃肿,这无疑降低了代码的可读性.另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的对象类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的OCP原则. 基于这种场景,我们可以考虑使用“多态”来代替冗长的条

以多态取代条件表达式

1.案例 话说最近直播很火嘛,反正我今天已经看了一晚上大胸了 我们看到,直播间里大致分为3类观众: 1.普通观众 2.房管 3.超管 如何区分这三种观众呢?我们发现,普通观众只显示自己的昵称,房管在自己的昵称前面还有一个醒目的“房管”标记,当然,超管的昵称前有个醒目的“超管”标记.看直播的都希望自己有个标记,因为这样才能装13啦... 2.条件表达式 现在,我们通过编写代码来区分这3种观众. 1.编写3个类. class CommonAudience; //普通观众 class HouseMan

重构第六天:用条件语句替换异常

在工作中经常遇到用异常去控制程序流程,下面是一个普遍的例子: public class Microwave { private IMicrowaveMotor Motor { get; set; } public bool Start(object food) { bool foodCooked = false; try { Motor.Cook(food); foodCooked = true; } catch (InUseException) { foodcooked = false; }

Java使用条件语句和循环结构确定控制流

与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流.本文将简单讲解条件.循环和switch. 一.块作用域 块(block),即复合语句.是指由一对大括号括起来的若干条简单的Java语句.块确定了变量的作用域. 比如: 1 public class Code { 2 static 3 { 4 System.out.println("1"); 5 } 6 { 7 System.out.println("2"); 8 } 9 public Code() 1