——Beck奶奶,论保持小孩清洁的哲学 ---- 代码的坏味道这一章集中论述该何时重构。具体的重构方法在后面的章节。 “没有任何度量规矩比得上见识广博者的直觉。 重构手法之一:改名(改变函数声明,变量改名,字段改名) 3.2 消除重复代码——提炼函数 同一个类的两个函数含有相同的表达式——提炼函数。 重复的代码段位于同一个超类的不同子类中——函数上移。 3.5 全局变量 全局变量的问题:代码库的任何一个角落都可以修改,且无法探测。(代码病毒) 处理方法:封装变量。用函数封装起来,再搬到类或模块里,控制其访问权限。 3.6 发散式变化与霰弹式修改 发散式变化:遇到变化时固定修改某一部分代码。 霰弹式修改:代码的坏味道其中一种,遇到变化需要修改很多地方。 减小模块的耦合,实现模块的独立。 3.14 过大的类 造成重复代码。 提炼类,提炼超类。 3.15 注释 “当你感觉需要写注释时,请先尝试重构。” 注释的应用场景: 这段代码做了什么 记录将来的打算 为什么做
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 希望能帮大家避免踩坑,让代码更加高效优雅。 本文作者: 王超,花名麟超,阿里巴巴高级地图技术工程师,一直从事Java研发相关工作。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 希望能帮大家避免踩坑,让代码更加高效优雅。 本文作者: 王超,花名麟超,阿里巴巴高级地图技术工程师,一直从事Java研发相关工作。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 希望能帮大家避免踩坑,让代码更加高效优雅。 本文作者: 王超,花名麟超,阿里巴巴高级地图技术工程师,一直从事Java研发相关工作。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 反例: return (x); return (x + 2); int x = (y * 3) + 1; int m = (n * 4 + 2); 正例: return x; return x + 2 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数。所以,为了避免 java "小白"使用有误,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 希望能帮大家避免踩坑,让代码更加高效优雅。 本文作者: 王超,花名麟超,阿里巴巴高级地图技术工程师,一直从事Java研发相关工作。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 反例: return (x); return (x + 2); int x = (y * 3) + 1; int m = (n * 4 + 2); 正例: return x; return x + 2 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 反例: return (x); return (x + 2); int x = (y * 3) + 1; int m = (n * 4 + 2); 正例: return x; return x + 2 ; int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。
代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。 这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。 int x = y * 3 + 1; int m = n * 4 + 2; 工具类应该屏蔽构造函数 工具类是一堆静态字段和函数的集合,不应该被实例化。 但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数。所以,为了避免 java "小白"使用有误,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。
com.netflix.zuul.message.ZuulMessageImpl#getBody 但不幸的是,内部每次获取对象繁琐,并且 new String() 创建返回 优化: 取一次,缓存在 Context 中,需要时从 Context 获取 3. 1),改为 HashMap,Key 为 Method,Value 为 Set <String> apis,封装统一方法获取,RestApiManager#getApis(String method) 3.
系统学习Windows客户端开发 Martin Fowler的《重构》一书中介绍了许多安全小重构的方法,同时这本书也介绍了什么样的代码需要重构,作者专门有一章<代码的坏味道>专门作了介绍。 其中有一些坏味道的代码片段很常见,我为此作了整理,读者尽量不要写出这类代码,看到这类代码时考虑是否可以优化它(如何优化就去阅读《重构》这本书)。 重复代码 同一个代码片段/代码结构在不同的地方出现,当需要修改的时候,得修改多处。 过长函数(函数体过大) 函数的实现复杂,代码行数太多,不易理解和维护。 项目提前约定好代码行最大字符数,现在的IDE编辑器都支持显示代码宽度标准线,超过标准线的代码就能被闻到坏味道。 真正的编程高手是先为人写代码,再为计算机写代码。
但是在重构的过程中,发现有些测试都是没有意义的,所以我变转向开始研究测试坏味道,顺便在 Coca 中写了个识别代码测试坏味道的工具。 测试代码坏味道 代码坏味道是对应于系统中的更深层问题的表面指示。 我们一般谈论代码坏味道的时候,主体是项目代码,而测试代码坏味道则往往被人忽略了。 测试代码坏味道,是指单元测试代码中的不良编程实践(例如,测试用例的组织方式,实现方式以及彼此之间的交互方式),它们表明测试源代码中潜在的设计问题。 如 Robert C. 先让我们来看看有哪些常见的测试坏味道: 空的测试。 坏味道检测工具 欢迎成为 Coca 的忠实用户,只需要运行 coca tbs,就可以识别出你的 Java 代码中的测试味道。如下是 Arduino 源码中的测试坏味道: ?
导致程序崩溃的代码显然是错了,但崩溃并不是衡量程序问题的唯一指标。代码里的通常会隐藏一些漏洞或不可读的代码 代码的坏味道指的是一种揭示潜在问题的代码模式。 几种常见的代码坏味道: - 重复代码 - 魔数 - 注释掉的代码和死代码 - 打印调试 - 带有数字后缀的变量 - 本该是函数或者模块的类 - 嵌套列表解析式 - 空的except块和糟糕的错误信息 坏味道代码带来的问题 3、注释掉的代码和死代码 注释过的代码和死代码都是代码的坏味道,因为它们会形成误导,让程序员认为这些代码是程序的可执行部分。 最后,我们要正视代码的坏味道,有些代码的坏味道根本不是真正的坏味道。举两个例子, 1、函数应该仅在末尾处有一个return语句。 2、函数最多只能有一个try语句。 以上这些都算不上坏味道,因此我们在实际工作中,要识别坏味道。
为了一个恼人的名字所付出的纠结,往往能够推动我们对代码进行精简 重复代码 如果你在一个以上的地点看到相同的代码结构,那么可以肯定:设法将他们合二为一 阅读这些重复的代码时你就必须加倍仔细,留意其间细微的差异 ,如果要修改就必须找出所有的副本来修改 过长代码 据我们的经验,活得最长,最好的程序,其中的函数都比较短 初次接触到这种代码库的程序员常常会觉得“计算都没有发生”——程序里满是无穷无尽的委托调用。 我么可以对一组甚至短短一行代码做这样的事,哪怕替换后的函数调用动作比函数自身还要长,只要函数名称能够解释其用途,我们也该毫不犹豫那么做。 而且没有任何机制可以侦测出到底哪段代码做出了修改,一次又一次,全局数据造成了哪些诡异的bug,而这些问题的根源却在遥远的别处,想要找出出错的代码难于登天 首要的防御手段是封装变量 // bad const 每当我们看到可能被各处代码污染的数据,这总是我们应对的第一招。
Duplicated Code(重复的代码) 坏味行列中首当其冲的就是Duplicated Code。如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好。 这时候你需要做的就是采用ExtractMethod提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。 2. 3. Large Class(过大类) 如果想利用单一class做太多事情,其内往往就会出现太多instance变量。一旦如此,Duplicated Code也就接踵而至了。 如果每遇到某种变化,你都必须在许多不同的class内做出许多小修改以响应之,你所面临的坏味道就是Shotgun Surgery。 例如Java就以基本型别表示数值,而以class表示字符串和日期——这两个型别在其它许多编程环境中都以基本型别表现。 10.
过度委托,举例:a使用b的b1 b2 b3三个函数,但是b1 b2 b3这三个函数都是c的c1 c2 c3。那么就把b这个中间人去掉,直接a使用c1 c2 c3 17. 注释 Comments 一段又长又臭的代码,无法自解释,只能靠注释解释其含义。这不是注释原本的意义。
坏味道本身并不代表存在错误,但是通常是代码维护困难和扩展性差的征兆。识别和解决这些坏味道是我们提升代码质量的重要步骤。今天灸哥和大家一起聊聊我们常见的代码坏味道以及解决之道。 ,可以借助集体智慧来发现潜在的坏味道并及时修复代码分析:使用静态的代码分析工具可以帮助程序员自动识别一些常见的代码坏味道重构实践:通过不断地重构代码,可以逐渐消除坏味道,提高代码质量常见坏味道过长方法过长方法的坏味道一般表现为方法过于冗长 .移除重复代码,使用辅助方法来提高可读性3.简化条件表达式,使用早返回减少嵌套我们来看看具体的代码示例// 坏味道代码public void processOrder(Order order) { // 坏味道代码int result = (a * 3) + (b / 2) - 5;// 重构后的代码private static final int MULTIPLIER_A = 3;private ***我本次列举出比较常见的代码坏味道,除了这些还有其他的代码坏味道,欢迎留言交流,也欢迎大家继续总结关于代码坏味道的内容。通用识别和解决这些常见的代码坏味道,是可以显著提高代码的质量和可维护性的。
发散式变化(Divergent Change) VS 霰弹式修改(Shotgun Surgery) 一旦需要修改,我们希望只在系统的一个地方进行修改,否则,就属于两种非常相似的坏味道的一种:如果某个类经常因为不同的原因在不同的地方发生变化 减少字段和参数的个数,当然可以去除一些坏味道,但更重要的是:一旦拥有新对象,你就有机会寻找Feature Envy,这可以帮你指出能够移至新类中的种种方法。 过度设计(Speculative Generality) 当有人说“噢,我想我们有一天需要做这个事情”,并因此而企图以各种各样的钩子和特殊情况来处理一些非必要的事情,这种坏味道就出现了。 实际代码中你看到的可能是一长串getXXX()调用,意味着客户代码将与查找目标对象过程中的导航结构紧密耦合,一旦对象间的关系发生任何变化,客户端就会受到影响。 过多的注释(Comments) 常常会有这样的情况:你看到一段代码有着长长的注释,然后发现,这些注释之所以存在乃是因为代码很糟糕。当你需要些注释时,要先尝试重构下代码,争取让代码拥有自说明性。
02 代码重复 使用IDEA的小伙伴应该都知道,如果你的代码存在重复,那么重复的代码颜色会变的,把鼠标放上去就会提示你存在多个一毛一样的代码,建议你使用同一块代码。 解决办法:把共同代码块提取出来。 我们在开发的时候,可能多个人对同一个文件进行修改,比如A写一个类,但是代码没有格式化,然后把代码提交上去,这时候B把你代码拉下来改动一部分,然后格式化了代码,但是B还没有提交,然后A也再次把本地代码改了一部分 ,B把代码提交了,B这时候是无法提交代码的,只能先更新代码。 那么问题来了,B已经把代码格式化了,A得合并代码,A合并的时候会发现B把代码大面积改动了,甚至A得细心的看每一行代码,其实很有可能B只改一行代码,但是由于B格式化了代码,A没有格式化。 这样会导致A花大量时间在合并代码上。为了避免这种问题的出现 ,建议在提交代码前进行格式化代码。另外一个问题就是代码格式化后对于阅读更加赏心悦目。原始代码: ? 格式化后: ?