重构
参宿_七
格物致知
展开
-
处理继承关系
1. 函数上移重复的代码是滋生bug的温床,因为很容易修改一个而忘了修改另一个。当多个子类都有功能类似的函数时,则将这个函数总结,提升到父类中。如果该函数还引用了子类中的其他方法和字段,把它们都上移到父类中。其他本没有这个函数的子类可以实现缺省方法,或者抛出异常。4. 函数下移如果一个父类中的方法只与少数几个子类相关,则下移到这几个子类中。3. 构造函数本体上移将子类中公共语句...原创 2019-12-27 20:56:08 · 626 阅读 · 0 评论 -
重构API
1. 将查询函数与修改函数分离因为查询是没有副作用的,但是修改函数却有可能有副作用。这个也可以引申为将查询函数与响应函数分离。就是在查询函数中将所有可能造成副作用的语句提炼成一个函数。这样需要关心的代码就更少了。2. 函数参数化如果多个函数逻辑非常相似,只有一些字面量值不同,那么可以将这些字面量作为参数传入,将多个函数合并成一个。3. 移除标记参数标记参数是指,调用者用它来指示...原创 2019-12-26 17:35:17 · 258 阅读 · 0 评论 -
简化条件逻辑
1. 分解条件表达式对条件表达式的每一个分支都提炼一个方法,甚至是对条件语句提炼一个方法,便于理解。2. 合并条件表达式如果多个检查条件各不相同,但最终行为却一致,则使用逻辑与和逻辑或将其合并为一个条件表达式。3. 以卫语句取代嵌套条件表达式条件表达式一般有两种风格,一是两个条件分支都属正常行为,另一种是只有一个条件分支是正常行为,另一个分支则是异常情况。对于第二种风格,我们应...原创 2019-12-24 17:49:44 · 379 阅读 · 0 评论 -
重新组织数据
将一个值用于多个用途,就是催生混乱与bug的温床1. 拆分变量如果一个变量有多个用途,就为每个用途声明一个变量。还有,如果要对参数改值,也先复制一份,对副本改值,返回副本。2. 字段改名给字段取一个准确的名字。好的命名及数据分布,能让别人只看类的字段就理解这些类的行为。3. 以查询取代派生变量尽量把可变数据的作用于限制在最小范围,如果使用调用查询函数替代变量,就能避免 ...原创 2019-12-24 17:44:52 · 257 阅读 · 1 评论 -
搬移特性
1. 搬移函数如果一个函数频繁引用其他上下文的元素,而对自身上下文的元素却很少调用,说明它属于另一个上下文。对于与方法同名的变量,想想它是否有存在的必要。2. 搬移字段数据结构是一个健壮程序的根基,坏的数据结构本身会隐藏程序的真实意图。把字段放到适合的类中,或是为相互关联的字段创建一个类。3. 搬移语句到函数如果多个方法调用a方法之前,都要写一样的语句,如判断语句,那么就把...原创 2019-12-24 17:25:23 · 341 阅读 · 0 评论 -
封装
类是为隐藏信息而生,类与模块如果都能很好地封装自己,那么将更有利于解耦,理解,修改,移植。1. 封装记录以数据类取代记录,为每个变量写get/set方法,最直接的好处是当值被修改时,容易通过调试知道是在哪修改的。还有就是容易在读取、写入时做一些其他的验证等操作。这个在c#中的event action观察者模式中非常实用。2. 封装集合如果让取值函数返回集合本身,那么在外面修改了集合...原创 2019-12-24 16:51:08 · 148 阅读 · 0 评论 -
1. 第一组重构
1. 提炼函数当你想为接下来的一段代码写点注释时,那么这就暗示着,这段代码应该被提炼成一个函数,这个函数的名字应该是函数的功能,是做什么,而不是这么做,一般你想写什么注释,名字就重注释中抽取关键词。当遇到循环、条件等语句,可以将它们提炼成一个函数。提炼函数的目的是将意图与实现相分离。所以一般有个主函数,里面调用其他的函数,这个主函数包含的就是意图,其他函数就是实现。提炼函数时,如果要返...原创 2019-12-03 14:39:24 · 176 阅读 · 0 评论 -
0. 重构概述
这一系列的重构知识总结自马丁福勒的《重构 改善既有代码的设计》一书。为什么要重构?因为一个项目往往不只一个人在写,其他人也会来读写你的代码,有些人甚至自己写的代码几个月之后就看不懂当初自己写的是什么了。重构的目的:改进软件的设计,使软件更易理解,容易找出bug,在后期要添加新功能时,提高编程速度,重构后的代码更易调优。重构的时机:一般在添加新功能前,如果不太好添加,则...原创 2019-12-03 13:44:59 · 163 阅读 · 0 评论