系统学习Windows客户端开发 Martin Fowler的《重构》一书中介绍了许多安全小重构的方法,同时这本书也介绍了什么样的代码需要重构,作者专门有一章代码的坏味道>专门作了介绍。...其中有一些坏味道的代码片段很常见,我为此作了整理,读者尽量不要写出这类代码,看到这类代码时考虑是否可以优化它(如何优化就去阅读《重构》这本书)。...重复代码 同一个代码片段/代码结构在不同的地方出现,当需要修改的时候,得修改多处。 过长函数(函数体过大) 函数的实现复杂,代码行数太多,不易理解和维护。...项目提前约定好代码行最大字符数,现在的IDE编辑器都支持显示代码宽度标准线,超过标准线的代码就能被闻到坏味道。...函数的实现用到某个类的许多数据 考虑该函数是否可以作为这个类的一个public方法。
导致程序崩溃的代码显然是错了,但崩溃并不是衡量程序问题的唯一指标。代码里的通常会隐藏一些漏洞或不可读的代码 代码的坏味道指的是一种揭示潜在问题的代码模式。...几种常见的代码坏味道: - 重复代码 - 魔数 - 注释掉的代码和死代码 - 打印调试 - 带有数字后缀的变量 - 本该是函数或者模块的类 - 嵌套列表解析式 - 空的except块和糟糕的错误信息 坏味道代码带来的问题...3、注释掉的代码和死代码 注释过的代码和死代码都是代码的坏味道,因为它们会形成误导,让程序员认为这些代码是程序的可执行部分。...优化坏味道的方法 1、重复代码 解决重复代码的方法是去重,简单地说,通过把代码放在一个函数或者循环中,使其在代码中只出现一次。 2、魔数 解决方法是使用常量替代魔数。...6、嵌套列表解析式 最好的办法是把列表解析式扩展到一个或者多个for循环中。 最后,我们要正视代码的坏味道,有些代码的坏味道根本不是真正的坏味道。
Phodal:“咦,这个测试没有断言” 开发人员 A 笑了笑。 某次代码重构中,我发现代码的测试覆盖率很高,过程中出了一些错误,重构手法不正确是一个问题。...但是在重构的过程中,发现有些测试都是没有意义的,所以我变转向开始研究测试坏味道,顺便在 Coca 中写了个识别代码测试坏味道的工具。...不过呢,当你的业务进度压力大的时候,没有时间编写测试,反而 bug 就更多了。 测试代码坏味道 代码坏味道是对应于系统中的更深层问题的表面指示。...我们一般谈论代码坏味道的时候,主体是项目代码,而测试代码坏味道则往往被人忽略了。测试代码能直观地反应出代码的设计问题,它们是 API 的使用方,它们是 API 的第一等使用方。...坏味道检测工具 欢迎成为 Coca 的忠实用户,只需要运行 coca tbs,就可以识别出你的 Java 代码中的测试味道。如下是 Arduino 源码中的测试坏味道: ?
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。...这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。...删除未使用的局部变量,使代码更简洁更易维护。...未使用的方法参数具有误导性,删除未使用的方法参数,使代码更简洁更易维护。...但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数。所以,为了避免 java "小白"使用有误,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。
这时候你需要做的就是采用ExtractMethod提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。 2....通常如果class内的数个变量有着相同的前缀或字尾,这就意味有机会把它们提炼到某个组件内。如果这个组件适合作为一个subclass,你会发现Extract Subclass往往比较简单。 4....一旦需要修改,我们希望能够跌到系统的某一点,只在该处做修改。如果不能做到这点,你就嗅出两种紧密相关的刺鼻味道中的一种了。 6....如果每遇到某种变化,你都必须在许多不同的class内做出许多小修改以响应之,你所面临的坏味道就是Shotgun Surgery。...如果需要修改的代码散布四处,你不但很难找到它们,也很容易忘记某个重要的修改。 这种情况下你应该使用Move Method和Move Field把所有需要修改的代码放进同一个class。
好处在于使得我们更快地看清被处理的元素以及处理它们的动作。 12. 冗赘的元素 Lazy Element 指的是,多层不必要的包装。 如:方法a中包的是b,b包的是c,c包的是d。...过度委托,举例:a使用b的b1 b2 b3三个函数,但是b1 b2 b3这三个函数都是c的c1 c2 c3。那么就把b这个中间人去掉,直接a使用c1 c2 c3 17....但是在很多其他地方频繁的对该类的字段进行访问修改。那么可以考虑,将这些频繁的行为搬移到类的内部。也就是说,把处理数据的行为从客户端搬移到纯数据类里来。 21....被拒绝的遗赠 Refused Bequest 指的是,子类只想继承超类的部分字段和函数,其他的拒绝使用。这意味着继承体系设计错误。超类中的字段函数应该是子类的必备数据。...注释 Comments 一段又长又臭的代码,无法自解释,只能靠注释解释其含义。这不是注释原本的意义。
,觉得不值得费这个时间,但好的名字能节省未来用在猜谜上的大把时间 改名并不仅仅是修改名字而已,如果你想不出一个好名字,说明背后很有可能潜藏着更深的设计问题。...为了一个恼人的名字所付出的纠结,往往能够推动我们对代码进行精简 重复代码 如果你在一个以上的地点看到相同的代码结构,那么可以肯定:设法将他们合二为一 阅读这些重复的代码时你就必须加倍仔细,留意其间细微的差异...,如果要修改就必须找出所有的副本来修改 过长代码 据我们的经验,活得最长,最好的程序,其中的函数都比较短 初次接触到这种代码库的程序员常常会觉得“计算都没有发生”——程序里满是无穷无尽的委托调用。...每当我们看到可能被各处代码污染的数据,这总是我们应对的第一招。...至少你可以看见修改它的地方,并开始控制对它的访问,随后最好将这个函数转移到一个类或者模块中,只允许模块内部的代码使用它,从而尽量控制其作用域 全局数据印证了帕拉塞尔斯的格言:良药和毒药之间的区别就在于剂量
——Beck奶奶,论保持小孩清洁的哲学 ---- 代码的坏味道这一章集中论述该何时重构。具体的重构方法在后面的章节。 “没有任何度量规矩比得上见识广博者的直觉。...重构手法之一:改名(改变函数声明,变量改名,字段改名) 3.2 消除重复代码——提炼函数 同一个类的两个函数含有相同的表达式——提炼函数。 重复的代码段位于同一个超类的不同子类中——函数上移。...3.5 全局变量 全局变量的问题:代码库的任何一个角落都可以修改,且无法探测。(代码病毒) 处理方法:封装变量。用函数封装起来,再搬到类或模块里,控制其访问权限。...3.6 发散式变化与霰弹式修改 发散式变化:遇到变化时固定修改某一部分代码。 霰弹式修改:代码的坏味道其中一种,遇到变化需要修改很多地方。 减小模块的耦合,实现模块的独立。...3.14 过大的类 造成重复代码。 提炼类,提炼超类。 3.15 注释 “当你感觉需要写注释时,请先尝试重构。” 注释的应用场景: 这段代码做了什么 记录将来的打算 为什么做
如果每遇到某种变化,你都必须在许多不同的类内做出许多小修改,你所面临的坏味道就是Shotgun Surgery(散弹式修改)。...请使用Extract Class(提炼类)给这个可怜的孤儿创造一个家,然后把所有和这个变量相关的代码都放进这个新家。...先观察消息链最终得到的对象时用来干什么的,看看能否以Extract Method(提炼函数)把使用该对象的代码提炼到一个独立函数中,再运用Move Method(搬移函数)把这个函数推入消息链。...Comments(过多的注释) 注释本身不是一种坏味道,事实上他们还是一种香味呢。 有时候,注释之所以存在乃是因为代码很糟糕。把注释当做除臭剂是一种坏味道。...很多时候,注释可以帮助我们找到代码的坏味道。找到坏味道之后,我们首先应该以各种重构手法把坏味道去除。完成之后我们常常会发现:注释已经变得多余了,因为代码已经清晰说明了这一切。
你需要决定这个重复的代码放在哪里比较合适,并确保它被安置之后就不会在别的地方再次出现。 过长函数(Long Method) 程序越长越难以理解。...减少字段和参数的个数,当然可以去除一些坏味道,但更重要的是:一旦拥有新对象,你就有机会寻找Feature Envy,这可以帮你指出能够移至新类中的种种方法。...过度设计(Speculative Generality) 当有人说“噢,我想我们有一天需要做这个事情”,并因此而企图以各种各样的钩子和特殊情况来处理一些非必要的事情,这种坏味道就出现了。...但这往往不够,请反复运用Move Method将某些行为移入类,知道这两个函数的协议一致为止。如果你必须移动大量代码才可以完成这个工作,那还不如直接构建一个父类。...过多的注释(Comments) 常常会有这样的情况:你看到一段代码有着长长的注释,然后发现,这些注释之所以存在乃是因为代码很糟糕。当你需要些注释时,要先尝试重构下代码,争取让代码拥有自说明性。
02 代码重复 使用IDEA的小伙伴应该都知道,如果你的代码存在重复,那么重复的代码颜色会变的,把鼠标放上去就会提示你存在多个一毛一样的代码,建议你使用同一块代码。 解决办法:把共同代码块提取出来。...通常做法是提取成一个方法,然后有使用到的地方,调用这个方法即可。 03 代码起名 一个项目开发出来,如果不review代码,不做规范,后期很容易出现“同一个业务名出现各种各样的英文名”的情况。...比如说:账户通常翻译成account,但是有的人写成acct,有的人写成amount(这个我是见过的)。...04 神奇的魔法数字 项目开发中经常会遇到if(age==25)....。请问这个25代表什么?还有setStatus(0)这是什么意思?...,B把代码提交了,B这时候是无法提交代码的,只能先更新代码。
前言 之前在《重构·改善既有代码的设计.01》中初步了解了重构的基本前提,基础原则等入门知识。今天我们继续第二更...... 识别代码的坏味道 Duplicated Code 重复代码。...如果你发现某个继承体系的类名称前缀和另一个继承体系的类名称前缀完全相同,那么便是这种坏味道。 Lazy Class 冗赘类。一个类的所得不值其身价,就让他消失。...这时候应该使用重构手法把这类坏味道去除,重构之后你会发现注释变得多余,因为代码已经说明了一切。 构筑测试体系 自测代码的价值:修复错误通常比较快,但找出错误却是噩梦一场。...每次编译请把测试页考虑进去,每天至少执行每个测试一次 编写测试代码时, 一开始先让它们失败,测试一下测试代码的机制可以运行 每当收到一个bug报告,请先写一个单元测试来暴露这个bug 观察类该做的所有事情...小结 到此,刚看完整本书的5个章节。代码的坏味道和构筑测试体系加深了对于重构的认知。重构和设计模式等诸多思想一样,是需要反复学习,反复实践的。重构的技术就是以微小的步伐修改程序。
领取专属 10元无门槛券
手把手带您无忧上云