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

简介: 以多态取代条件表达式(Replace Conditional with Polymorphism):你手上有个条件表达式,它根据对象类型的不同而选择不同的行为;将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始的函数声明为抽象函数

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

你手上有个条件表达式,它根据对象类型的不同而选择不同的行为;将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始的函数声明为抽象函数

一、动机

1、面向对象术语中,听上去最高贵的词非多态莫属

2、正因为有了多态,所以你会发现,类型码的switch语句以及基于类型名称的if-then-else语句在面向对象程序中很少出现

二、做法

1、Replace Type Code with Subclass,Replace Type Code with State/Strategy

2、如果要处理的条件表达式是一个更大函数的一部分,先Extract Method

3、如果有必要,使用Move Method将条件表达式放置到继承结构的顶端

4、任选一个子类,在其中建立一个函数,使之覆写超类中容纳条件表达式的那个函数,将与该子类相关的条件表达式分支复制到新建函数中,并对它进行适当调整

5、为了顺利进行这一步骤,你可能需要将超类中的某些private字段声明为protected

6、编译,测试

7、在超类中删掉条件表达式内被复制的分支

8、编译,测试

9、针对条件表达式的每个分支,重复上述过程,直到所有的分支都被移到子类内的函数为止

10、将超类之中容纳条件表达式的函数声明为抽象函数

目录
相关文章
|
4月前
|
Python
Python函数式编程-Filter
Python函数式编程-Filter
|
存储 算法 编译器
C#OOP之二 变量和表达式
C#OOP之二 变量和表达式
45 0
|
存储 Java 开发者
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
131 0
|
并行计算 编译器
Lambda 表达式(使用前提、“类型推断”、作用、优缺点、Lambda还能省略的情况)
Lambda 表达式(使用前提、“类型推断”、作用、优缺点、Lambda还能省略的情况)
392 0
|
索引
改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
  系列博客       1. 改善代码设计 —— 优化函数的构成(Composing Methods)       2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)       3.
948 0
|
索引
一起谈.NET技术,改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
  系列博客       1. 改善代码设计 —— 优化函数的构成(Composing Methods)       2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)       3.
1016 0
|
索引
改善代码设计 —— 简化“.NET技术”条件表达式(Simplifying Conditional Expressions)
  系列博客       1. 改善代码设计 —— 优化函数的构成(Composing Methods)       2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)       3.
866 0
|
索引
改善“.NET研究”代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
  系列博客       1. 改善代码设计 —— 优化函数的构成(Composing Methods)       2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)       3.
733 0
|
Java 设计模式
第六章 接口,lamda表达式与内部类
接口 接口可以包含常量, 且不需要publish static final修饰, 接口的域会自动添加该修饰符. Java建议不要写多余的代码,因此省略修饰符更简洁. 全部都是常量的接口背离了接口的初衷,不建议使用 Java SE8 中, 允许接口增加静态方法,但这也有悖接口的初衷 接口的默认方法实...
1168 0
重构——38以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clause)
以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clause):函数中的条件逻辑使人难以看清正常的执行路径;使用卫语句表现所有特殊情况
3821 0