重构——39以多态取代条件表达式(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、将超类之中容纳条件表达式的函数声明为抽象函数
重构——39以多态取代条件表达式(Replace Conditional with Polymorphism)相关推荐
- 重构手法——提炼函数、搬移函数、以多态取代条件表达式
目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...
- 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...
- 重构-改善既有代码的设计:简化条件表达式(七)
简化条件表达式 1.Decompose Conditional 分解条件表达式 你有一个复杂的条件语句.从if.then.else三个段落中分别提炼出独立函数. 程序之中,复杂的条件逻辑是最常导致复杂 ...
- 代码重构(四):条件表达式重构规则
继续更新有关重构的博客,前三篇是关于类.函数和数据的重构的博客,内容还算比较 充实吧.今天继续更新,本篇博客的主题是关于条件表达式的重构规则.有时候在实现比较复杂的业务逻辑时,各种条件各种嵌套.如果处 ...
- Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)
函数中的条件逻辑使人难以看清正常的执行路径 double getPayAmount() {double result;if (isDead) {result = deadAmount();} else ...
- 如何以卫语句取代嵌套条件表达式
本文分享自华为云社区<以卫语句取代嵌套条件表达式 (Replace Nested Conditional with Guard Clauses)>,作者:JavaEdge. 动机 条件表达 ...
- 必会重构技巧:使用多态替换条件
使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象 举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型 ...
- java多态替换switch_第1章 重构,第一个案例(3):运用多态取代switch
3.运用多态取代与价格相关的条件逻辑 3.1 switch和"常客积分"代码的再次搬迁 (1)switch:最好不要在另一个对象的属性上运用switch语句 switch(getM ...
- 重构——34分解条件表达式(Decompose Conditional)
分解条件表达式(Decompose Conditional) 你有一个复杂的条件语句:从if,then,else三个段落中分别提炼出独立函数 一.动机 1.提高代码可读性 2.突出条件逻辑,更清楚的表 ...
最新文章
- 不通过AppStore,在iOS设备上直接安装应用程序的原理
- php facade模,PHP 设计模式之外观模式 Facade
- abap-在table control中实现查找功能
- 目前流行的装修风格_当下最流行的十大装修风格。目前主流的装修风格前十
- cocos2d-x游戏实例(25)-简易动作游戏(3)
- docker centos node nginx
- matlab填充点面,求大神指点绘制空间内散点图的包络面,,,散点程序如下
- Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
- lisp 发凹圆角_css能实现这样的内凹圆角吗?如何实现?具体代码是!!
- strace动态调试 php,PHP实现通过strace定位故障原因的方法
- postman json 中写注释_Swagger界面丑、功能弱怎么破?用Postman增强下就给力了!
- 添加游戏到游戏浏览器中的小工具
- stl算法:next_permutation剖析
- 电视android怎么连接手机助手下载,电视与手机怎么连接?最实用的三种小技巧!...
- SQLyog备份数据库
- SSH 与 SFTP
- Linux运维工程师面试题库,Linux运维工程师面试题库
- DLL注入——使用注册表
- php电影模板下载,【PHP源码】团啊VIP电影系统V3.7.6源码下载 带自动采集+手机版模板...
- 计算机网络设计——企业网络规划与搭建
热门文章
- AIX下删除LV后的现场保护和数据恢复方案
- ASP.NET Web 页面生命中的一天
- mac mysql 可视化工具_推荐3款好用的Redis、MySQL和MongoDB可视化管理工具
- [T-ARA][Bo Peep Bo Peep]
- Wireshark网络抓包(四)——工具
- 面向对象编程(一)——面向对象和面向过程
- linux下安装MySQL出错file /usr/share/mysql/charsets/latin2.xml from install of MySQL-......
- Delphi APP 開發入門(五)GPS 定位功能
- 切换运行时用户以及用户组
- Silverlight4.0(9) 之 分页控件轻量级的Session