From 96e3b0ac73ffe8bb8d880ae4751deaa1a7a62c1b Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 20 Mar 2018 10:14:56 +0800 Subject: [PATCH] auto commit --- notes/代码可读性.md | 52 +++++++++++++++++++++---------------------- notes/重构.md | 54 ++++++++++++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/notes/代码可读性.md b/notes/代码可读性.md index 0c5ab772..01550875 100644 --- a/notes/代码可读性.md +++ b/notes/代码可读性.md @@ -1,21 +1,21 @@ -* [可读性的重要性](#可读性的重要性) -* [用名字表达代码含义](#用名字表达代码含义) -* [名字不能带来歧义](#名字不能带来歧义) -* [良好的代码风格](#良好的代码风格) -* [编写注释](#编写注释) -* [如何编写注释](#如何编写注释) -* [提高控制流的可读性](#提高控制流的可读性) -* [拆分长表达式](#拆分长表达式) -* [变量与可读性](#变量与可读性) -* [抽取函数](#抽取函数) -* [一次只做一件事](#一次只做一件事) -* [用自然语言表述代码](#用自然语言表述代码) -* [减少代码量](#减少代码量) +* [一、可读性的重要性](#一可读性的重要性) +* [二、用名字表达代码含义](#二用名字表达代码含义) +* [三、名字不能带来歧义](#三名字不能带来歧义) +* [四、良好的代码风格](#四良好的代码风格) +* [五、编写注释](#五编写注释) +* [六、如何编写注释](#六如何编写注释) +* [七、提高控制流的可读性](#七提高控制流的可读性) +* [八、拆分长表达式](#八拆分长表达式) +* [九、变量与可读性](#九变量与可读性) +* [十、抽取函数](#十抽取函数) +* [十一、一次只做一件事](#十一一次只做一件事) +* [十二、用自然语言表述代码](#十二用自然语言表述代码) +* [十三、减少代码量](#十三减少代码量) -# 可读性的重要性 +# 一、可读性的重要性 编程有很大一部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。 @@ -23,7 +23,7 @@ 只有在核心领域为了效率才可以放弃可读性,否则可读性是第一位。 -# 用名字表达代码含义 +# 二、用名字表达代码含义 一些比较有表达力的单词: @@ -38,7 +38,7 @@ 为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是:作用域越大,名字越长。因此只有在短作用域才能使用一些简单名字。 -# 名字不能带来歧义 +# 三、名字不能带来歧义 起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。 @@ -48,7 +48,7 @@ 布尔相关的命名加上 is、can、should、has 等前缀。 -# 良好的代码风格 +# 四、良好的代码风格 适当的空行和缩进。 @@ -64,7 +64,7 @@ int c = 111; // 注释 把相关的代码按块组织起来放在一起。 -# 编写注释 +# 五、编写注释 阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是并不需要为每个方法都加上注释,比如那些简单的 getter 和 setter 方法,为这些方法写注释反而让代码可读性更差。 @@ -83,7 +83,7 @@ int c = 111; // 注释 |HACH| 粗糙的解决方案 | |XXX| 危险!这里有重要的问题 | -# 如何编写注释 +# 六、如何编写注释 尽量简洁明了: @@ -118,7 +118,7 @@ int num = add(\* x = *\ a, \* y = *\ b); 使用专业名词来缩短概念上的解释,比如用设计模式名来说明代码。 -# 提高控制流的可读性 +# 七、提高控制流的可读性 条件表达式中,左侧是变量,右侧是常数。比如下面第一个语句正确: @@ -144,7 +144,7 @@ do / while 的条件放在后面,不够简单明了,并且会有一些迷惑 在嵌套的循环中,用一些 return 语句往往能减少嵌套的层数。 -# 拆分长表达式 +# 八、拆分长表达式 长表达式的可读性很差,可以引入一些解释变量从而拆分表达式: @@ -171,7 +171,7 @@ if(a || b) { } ``` -# 变量与可读性 +# 九、变量与可读性 **去除控制流变量** 。在循环中通过使用 break 或者 return 可以减少控制流变量的使用。 @@ -276,7 +276,7 @@ var setFirstEmptyInput = function(new_value) { }; ``` -# 抽取函数 +# 十、抽取函数 工程学就是把大问题拆分成小问题再把这些问题的解决方案放回一起。 @@ -324,17 +324,17 @@ public int findClostElement(int[] arr) { 函数抽取也用于减小代码的冗余。 -# 一次只做一件事 +# 十一、一次只做一件事 只做一件事的代码很容易让人知道其要做的事; 基本流程:列出代码所做的所有任务;把每个任务拆分到不同的函数,或者不同的段落。 -# 用自然语言表述代码 +# 十二、用自然语言表述代码 先用自然语言书写代码逻辑,也就是伪代码,然后再写代码,这样代码逻辑会更清晰。 -# 减少代码量 +# 十三、减少代码量 不要过度设计,编码过程会有很多变化,过度设计的内容到最后往往是无用的。 diff --git a/notes/重构.md b/notes/重构.md index 1771a9b5..92a35946 100644 --- a/notes/重构.md +++ b/notes/重构.md @@ -34,15 +34,15 @@ * [22. 过多的注释](#22-过多的注释) * [四、构筑测试体系](#四构筑测试体系) * [五、重新组织函数](#五重新组织函数) - * [1. Extract Method(提炼函数)](#1-extract-method提炼函数) - * [2. Inline Method(内联函数)](#2-inline-method内联函数) - * [3. Inline Temp(内联临时变量)](#3-inline-temp内联临时变量) - * [4. Replace Temp with Query(以查询取代临时变量)](#4-replace-temp-with-query以查询取代临时变量) - * [5. Introduce Explaining Variable(引起解释变量)](#5-introduce-explaining-variable引起解释变量) - * [6. Split Temporary Variable(分解临时变量)](#6-split-temporary-variable分解临时变量) - * [7. Remove Assigments to Parameters(移除对参数的赋值)](#7-remove-assigments-to-parameters移除对参数的赋值) - * [8. Replace Method with Method Object(以函数对象取代函数)](#8-replace-method-with-method-object以函数对象取代函数) - * [9. Subsititute Algorithn(替换算法)](#9-subsititute-algorithn替换算法) + * [1. 提炼函数](#1-提炼函数) + * [2. 内联函数](#2-内联函数) + * [3. 内联临时变量](#3-内联临时变量) + * [4. 以查询取代临时变量](#4-以查询取代临时变量) + * [5. 引起解释变量](#5-引起解释变量) + * [6. 分解临时变量](#6-分解临时变量) + * [7. 移除对参数的赋值](#7-移除对参数的赋值) + * [8. 以函数对象取代函数](#8-以函数对象取代函数) + * [9. 替换算法](#9-替换算法) * [六、在对象之间搬移特性](#六在对象之间搬移特性) * [1. Move Method(搬移函数)](#1-move-method搬移函数) * [2. Move Field(搬移字段)](#2-move-field搬移字段) @@ -417,17 +417,23 @@ Java 可以使用 Junit 进行单元测试。 # 五、重新组织函数 -## 1. Extract Method(提炼函数) +## 1. 提炼函数 + +> Extract Method 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。 -## 2. Inline Method(内联函数) +## 2. 内联函数 + +> Inline Method 一个函数的本体与名称同样清楚易懂。 在函数调用点插入函数本体,然后移除该函数。 -## 3. Inline Temp(内联临时变量) +## 3. 内联临时变量 + +> Inline Temp 一个临时变量,只被简单表达式赋值一次,而它妨碍了其它重构手法。 @@ -442,7 +448,9 @@ return basePrice > 1000; return anOrder.basePrice() > 1000; ``` -## 4. Replace Temp with Query(以查询取代临时变量) +## 4. 以查询取代临时变量 + +> Replace Temp with Query 以临时变量保存某一表达式的运算结果,将这个表达式提炼到一个独立函数中,将所有对临时变量的引用点替换为对新函数的调用。Replace Temp with Query 往往是 Extract Method 之前必不可少的一个步骤,因为局部变量会使代码难以提炼。 @@ -466,7 +474,9 @@ double basePrice(){ } ``` -## 5. Introduce Explaining Variable(引起解释变量) +## 5. 引起解释变量 + +> Introduce Explaining Variable 将复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。 @@ -488,13 +498,17 @@ if(isMacOS && isIEBrower && wasInitialized() && wasResized) { } ``` -## 6. Split Temporary Variable(分解临时变量) +## 6. 分解临时变量 + +> Split Temporary Variable 某个临时变量被赋值超过一次,它既不是循环变量,也不是用于收集计算结果。 针对每次赋值,创造一个独立、对应的临时变量,每个临时变量只承担一个责任。 -## 7. Remove Assigments to Parameters(移除对参数的赋值) +## 7. 移除对参数的赋值 + +> Remove Assigments to Parameters 以一个临时变量取代对该参数的赋值。 @@ -509,13 +523,17 @@ int discount (int inputVal, int quentity, int yearToDate){ if (inputVal > 50) result -= 2; ``` -## 8. Replace Method with Method Object(以函数对象取代函数) +## 8. 以函数对象取代函数 + +> Replace Method with Method Object 当对一个大型函数采用 Extract Method 时,由于包含了局部变量使得很难进行该操作。 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。然后可以在同一个对象中将这个大型函数分解为多个小型函数。 -## 9. Subsititute Algorithn(替换算法) +## 9. 替换算法 + +> Subsititute Algorithn # 六、在对象之间搬移特性