代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析
1.以类取代类型码
适用情况:类之中有一个数值类型码,但它并不影响类的行为。
重构手段:以一个新的类替换该数值类型码。
重构类图示意:
这里的“不影响类的行为”是什么意思呢?
类型码往往和switch语句一起出现,只有当类型码不会在switch语句中引发行为变化时,才能以类来取代它。或者是根本没有条件语句。
2.以子类取代类型码
适用情况:你有一个不可变的类型码,它会影响类的行为。
重构手段:以类型码的宿主类为基类,并针对每一种类型码各创建一个子类。
重构类图示意:
Replace Type Code with Subclasses的主要做用实际上是搭建一个舞台,让Replace Conditional with Polymorphism得以一展身手。
3.以State/Strategy取代类型码
适用情况:你有一个类型码,它会影响类的行为,但你无法通过继承手法消除它。
重构手段:以状态对象或者具体策略对象取代类型码。
重构类图示意:
参考文章:
Replace Type Code with Class (以类取代类型码)
Replace Type Code with Subclasses (以子类取代类型码)
Replace Type Code with State/Strategy
相关文章:

NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入多对多映射关系多对多关联查询1.原生SQL关联查询2.HQL关联查询3.Criteria API关联查询结语多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Ord…

自动化运维—saltstack
2019独角兽企业重金招聘Python工程师标准>>> 自动化运维——saltstack 、ansible 一、自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁琐,容易出错,每日重复做相同的事情,…

史上最浅显易懂的Git教程!
Git初学者很好的一篇教程 mark : ) http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 转载于:https://www.cnblogs.com/anthony0859/p/3900327.html

狎昵关系和依恋情结辨诠
Inappropriate Intimacy(狎昵关系) 表现:两个classes过于亲密,花费太多时间去探究彼此的private成分 解决:你可以采用 Move Method 和 Move Field 帮它们划清界线,从而减少狎昵行径。你也可以看看是否运用…

win2000.win2003关闭端口详解--防黑必备
我相信有很多人都不知道自己开了什么端口.更加不知道怎么关闭端口. 你可以用查看端口的软件查看. 也可以通过在运行里输入"cmd" 在弹出的cmd命令行里输入 netstat -an 来查看自己开放端口.ip地址的后面的就是端口号. 以下是我自己写的一篇关于关闭端口的详细步骤和多…

网站基于vs,复选框,单选款
前端代码: <% Page Language"C#" AutoEventWireup"true" CodeFile"Default2.aspx.cs" Inherits"Default2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or…

thinphp 整合ueditor
我的ueditor是部署在public/editor 部署前台页面 <script type"text/javascript" > var UEDITOR_HOME_URL: "__PUBLIC__/ueditor/" </script><script id"container" name"$des" type"text/plain">这里写你…

笔画宽度变化(C++和matlab算法)
最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖。现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差。 全部文件网盘下载地址:ht…

bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)
传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y$为第二关键字,那么同一横坐标的一定在…

[导入]源代码版本控制(一)
开发过程当中源代码的版本控制一直是个大问题。项目规模小了还好办,人的脑子还能记过来,项目大了,可能用各式各样的表格来记录版本信息和源代码内容,但这个办法本身的文档组织又是个问题,谁来维护?谁来更改…

重构技巧分别能够解决哪些代码味道
1.提炼类可以解决的5种代码味道: 过大类 重复代码 基本类型偏执 令人迷惑的暂时值域 狎昵关系 2.将类内联化可以解决的3种代码味道 冗赘类 夸夸其谈的未来性 霰弹式修改 3.隐藏委托关系解决的2种代码味道 狎昵关系 过度耦合的消息链 4.复制被监视的数据 过大类 5.以…

python爬取电影和美食数据实战
本文使用的是requests正则来匹配网页内容,对于数据量较多的采用了多线程抓取的方法,共3个案例,分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。1、首先选择想要爬取的网站2、确…

Asp.Net页面执行流程分析
在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx页面请求时后台到底做了什么?当然asp.net做了很多事情,过程也比较复杂,本文主要分析一下大…

正则验证非法字符
function regText(text){var reg /^[\s\u4e00-\u9fa5a-z0-9_-]{0,}$/;if(!reg.exec(text)){console.log("非法字符")}else{console.log("有效字符")} } regText("abc") 验证 :汉字、英文、数字、下划线、中划线、空格 转载于:https…

活动排序工具之双代号网络(AOA)与单代号网络(AON)[cont.]
箭线图ADM/双代号网络AOA 图示 箭线表示活动 节点表示一个活动的开始或结束 三要素:结点、箭线、线路 唯一使用虚活动的活动排序工具,虚活动用虚线箭头表示,没有历时,不需资源,只表达活动关系的需要 只使用一种活动之…

并发任务的可视化
一、任务要求:在linux系统中设计一个父进程,三个子进程(A,B,C)。子进程A,B同时被父进程启动来计算(不实现具体的计算任务,先用CPU空跑来代替)。进程A计算5分钟,而进程B计算8分钟。当进程A,B都计算完成后才能…
银监会警示担保圈贷款风险 联保贷款变异 防多米诺效应
互保联保本是解决小微企业以及农村金融贷款需求的重要创新,但却在部分行业、部分地区逐渐变异,成为引发风险事件的诱因。 据媒体报道,银监会近日发文要求加强企业担保圈贷款风险的防范和化解工作。银监会警示,担保圈企业风险较高的…

SharePoint 2007 系列(4) -Site Settings
Site administration 转载于:https://www.cnblogs.com/xuxiaoguang/archive/2008/11/05/1326913.html

软件项目管理重点总结
文章目录概论走进项目管理把控环境,控制过程整合项目资源控制项目范围保障项目进度驾驭项目成本保证项目质量协调项目人力资源改善项目的沟通应对项目风险关注项目的采购和外包概论 项目的定义:为创造一个特定的产品、服务或者成果而采取的临时性的努力…

jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误
当使用jquery1.3以上版本时,进行ajax参数传值时,会出现以下的一个错误: ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, column 3. 这个错…

数据绑定以及Container.DataItem绑定技巧
数据绑定以及Container.DataItem绑定技巧 灵活的运用数据绑定操作绑定到简单属性:<%#UserName%>绑定到集合:<asp:ListBox id"ListBox1" datasource<%# myArray%> runat"server">绑定到表达式:<%#(class1.property1.ToString() "…

LeetCode 76. Minimum Window Substring / 567. Permutation in String
76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置。 思路虽然不难,但是如何判断当前区间是否包含所有t中的字符是一个难点(t中字符有重…

计算机网络中的协议数据单元的控制信息主要包括哪些内容
在计算机网络的数据传输过程中会对数据进行封装,俗称加头(链路层还会加尾),增加的控制信息主要包括以下内容: 地址(Address):用来标识发送端或接收端差错检测编码(Error-detecting code):用于差错检测或纠正协议控制(…

jQuery 超屏加载
jQuery 超屏加载,当文档超出屏幕的高度时,加载最新下个列数据 $(window).scroll(function () {var height $(document).height(); //页面的高度var keheight $(window).height(); //浏览器可视的高度var sheight $(document).scrollTop(); //滚动的高…

自己动手,打造轻量级VSCode/C#环境代替LinqPad
.Net 的项目都挺重的,一直想找一个轻量级的 CSharp 环境,能像Python那样,选一个文件就能跑的。之前用的是 LinqPad,但它的缺点也很明显: (1) 不付费,自动完成不能用(…

让html:error只显示第一条错误信息
struts-config.xml 中的 <plug-in className"org.apache.struts.validator.ValidatorPlugIn"> 里面加上 <set-property property"stopOnFirstError" value"true"/> 就可以了 </plug-in> 转载于:https://www.cnblogs.com/kakak…

(C++)除基取余法:将十进制数转化为Q进制数
所谓基,就是指将要转换成的进制Q。 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数。 代码实…

《C++ Primer 4th》读书笔记 第5章-表达式
原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912114.html 转载于:https://www.cnblogs.com/DayByDay/p/3912114.html

vue - check-versions.js for child_process
webpack之类的配置文件. webpack.base.conf.js