Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

浅析代码质量

232 views

Published on

如何评估一份代码的质量?如何提升和改进一份代码的质量?

Published in: Technology
  • Be the first to comment

  • Be the first to like this

浅析代码质量

  1. 1. 浅析代码质量 张砷镓@赶集 114年8月25日星期⼀一
  2. 2. 0. 代码质量 Review时让人觉得不爽的次数……的倒数 214年8月25日星期⼀一
  3. 3. 314年8月25日星期⼀一
  4. 4. BAD CODE 414年8月25日星期⼀一
  5. 5. GOOD CODE 514年8月25日星期⼀一
  6. 6. 代码的质量体现在哪些方面? 614年8月25日星期⼀一
  7. 7. 代码质量的构成 正确性 鲁棒性 高效性 可读性 可维护性 可复用性 714年8月25日星期⼀一
  8. 8. 1. 正确性 对产品需求的完成度 814年8月25日星期⼀一
  9. 9. 如何才能完整、准确地实现需求? 914年8月25日星期⼀一
  10. 10. 活动 • ⼀一人⼀一张纸 • ⼀一名志愿者 准备 准备就绪后,志愿者开始宣读指令, 其他参与者执行。不准提问。 内容 1014年8月25日星期⼀一
  11. 11. 指令 • 闭上眼睛 • 把纸对折 • 再对折 • 把左上角撕下来 • 旋转180度 • 把右上角撕下来 • 睁开眼睛 • 把纸展开,举到头顶 1114年8月25日星期⼀一
  12. 12. 活动 • ⼀一人⼀一张纸 • ⼀一名志愿者 准备 准备就绪后,志愿者开始宣读指令, 其他参与者执行。 允许提问。 内容 1214年8月25日星期⼀一
  13. 13. 指令 • 闭上眼睛 • 把纸对折 • 再对折 • 把左下角撕下来 • 旋转180度 • 把右下角撕下来 • 睁开眼睛 • 把纸展开,举到头顶 1314年8月25日星期⼀一
  14. 14. 不存在完善的需求文档 不同的人对相同的文档理解不同 即使理解相同,执行结果也可能不同 只有不断沟通细化,才能真正实现需求 如何准确地实现需求? 1414年8月25日星期⼀一
  15. 15. PHP里的坑你知道多少? 1514年8月25日星期⼀一
  16. 16. bool(true) bool(true) bool(true) bool(true) 1614年8月25日星期⼀一
  17. 17. bool(true) int(0) bool(false) 1714年8月25日星期⼀一
  18. 18. 字符串和数字比较,会将双方转换为数字 两个由数字字符串比较,会先转换为数字 数字开头的字符串,会被转换为开头的数字 不是数字开头的字符串,会转换为0 部分array系列函数提供强类型校验的参数 PHP是弱类型语言 1814年8月25日星期⼀一
  19. 19. 从前有个程序员,他遇到了⼀一个问题…… 他想:“没事,用线程就好了嘛~” 现他有在个两问了题。 1914年8月25日星期⼀一
  20. 20. 使用Mysql事务 使用原子级操作 使用锁 使用异步队列 解决重入问题 2014年8月25日星期⼀一
  21. 21. 90%的程序员写不出正确的二分查找? 2114年8月25日星期⼀一
  22. 22. 实践 需求 设计⼀一个二分查找函数,接受参数为⼀一个有序数 组和⼀一个数字。如果该数字在有序数组中,则返 回其下标,否则返回-1。 2214年8月25日星期⼀一
  23. 23. Let’s coding! 2314年8月25日星期⼀一
  24. 24. 错误更可能发生在临界值上 确保循环条件收敛,避免死循环 直觉开发 vs 测试驱动开发 收获 2414年8月25日星期⼀一
  25. 25. 持续沟通,细化需求 避免隐式类型转换 考虑重入问题 确定循环条件收敛 测试驱动开发 小结 2514年8月25日星期⼀一
  26. 26. Q & A 2614年8月25日星期⼀一
  27. 27. 两种写代码的方式: 1、写得很简单,明显没有错误; 2、写得很复杂,没有明显的错误。 2714年8月25日星期⼀一
  28. 28. 2. 鲁棒性 应对各种意外情况的能力 2814年8月25日星期⼀一
  29. 29. 为什么台球中组合球很难打? 2914年8月25日星期⼀一
  30. 30. 3014年8月25日星期⼀一
  31. 31. 3114年8月25日星期⼀一
  32. 32. 3214年8月25日星期⼀一
  33. 33. 每⼀一个步骤都可能出问题 可能出问题的地方⼀一定会出问题 每增加⼀一个环节,就会引入新的问题 是否解决问题?解决什么问题? 认为没有问题,是最大的问题 哪里会出问题? 3314年8月25日星期⼀一
  34. 34. 你知道多少种攻击网站的方法? 3414年8月25日星期⼀一
  35. 35. 本质:在数据中加入SQL语句 SQL注入 解决:对数字型数据进行显式类型转换    对字符型数据进行特殊字符转义 3514年8月25日星期⼀一
  36. 36. 本质:在数据中加入script标签 XSS跨站攻击 解决:在显示用户数据前进行HTML标签转义    在显示用户数据前过滤危险标签 3614年8月25日星期⼀一
  37. 37. 本质:将服务端代码作为附件上传 上传漏洞 解决:限制对上传目录的FASTCGI解析    使用try_files对$fast_script_name进行检查 3714年8月25日星期⼀一
  38. 38. 外部数据和服务永远是不可靠的 用户输入的数据需要检查和格式化 输出的数据也需要格式化 防御性编程 3814年8月25日星期⼀一
  39. 39. 下面的代码有什么隐患? 3914年8月25日星期⼀一
  40. 40. 解决方法 4014年8月25日星期⼀一
  41. 41. 慎用递归 递归调用需要压栈,可能导致溢出 绝大多数递归逻辑可用循环改写 4114年8月25日星期⼀一
  42. 42. 在发生错误后,需要做些什么? 4214年8月25日星期⼀一
  43. 43. 4314年8月25日星期⼀一
  44. 44. 4414年8月25日星期⼀一
  45. 45. 4514年8月25日星期⼀一
  46. 46. 4614年8月25日星期⼀一
  47. 47. 在日志中保存现场 保护用户数据不丢失 向用户提供可理解的错误信息 告诉用户接下来应该做什么 慎用抛出异常 优雅地失败 4714年8月25日星期⼀一
  48. 48. 实践 需求 设计⼀一个单页面的留言板程序,实现以下功能: 1、填写留言内容并提交; 2、按时间顺序显示所有留言内容。 4814年8月25日星期⼀一
  49. 49. Let’s coding! 4914年8月25日星期⼀一
  50. 50. 收获 完美的系统不可能存在 优化改进,永无止境 问题存在优先级之分 解决当下最需要解决的问题 5014年8月25日星期⼀一
  51. 51. 正确认识问题的存在 合理地解决问题 防御式编程 慎用递归 优雅地失败 小结 5114年8月25日星期⼀一
  52. 52. Q & A 5214年8月25日星期⼀一
  53. 53. 你所担心的事情⼀一定会发生。 5314年8月25日星期⼀一
  54. 54. 3. 高效性 时间复杂度与空间复杂度之间的平衡 5414年8月25日星期⼀一
  55. 55. 怎样使⼀一段代码运行得最快? 5514年8月25日星期⼀一
  56. 56. 全部删掉。 5614年8月25日星期⼀一
  57. 57. 没有必要的代码⼀一律删除 不是必须现在进行的操作⼀一律延后 优化的原则 5714年8月25日星期⼀一
  58. 58. 如何优化下面的代码? 5814年8月25日星期⼀一
  59. 59. 优化方法 5914年8月25日星期⼀一
  60. 60. 如何优化下面的代码? 6014年8月25日星期⼀一
  61. 61. 优化方法 6114年8月25日星期⼀一
  62. 62. 避免在循环判断中进行计算 避免在循环体中进行代价昂贵的操作 利用自增减操作节省临时变量 优化循环 6214年8月25日星期⼀一
  63. 63. 如何优化下面的代码? 6314年8月25日星期⼀一
  64. 64. 非递归版本 6414年8月25日星期⼀一
  65. 65. 带缓存版本 6514年8月25日星期⼀一
  66. 66. 带数据表版本 6614年8月25日星期⼀一
  67. 67. 缓存中间结果 预先准备数据(查表法) 减少重复计算 6714年8月25日星期⼀一
  68. 68. ⼀一个真实的故事…… 6814年8月25日星期⼀一
  69. 69. 老公,晚上吃饺子吧,我看家里有 韭菜和鸡蛋,你去买点饺子皮呗~ 好啊 昨天 下午 6:30 6914年8月25日星期⼀一
  70. 70. 恩,我这就给咱包。不过好像醋和 酱油快没了,你再去买点呗~ 你怎么不早说……好吧。 买回来了,亲~ 昨天 下午 6:50 7014年8月25日星期⼀一
  71. 71. 老公,我还想吃薯片…… $!%^#&#&#!!! 拿好,您的醋和酱油~ 昨天 下午 7:10 7114年8月25日星期⼀一
  72. 72. 读CACHE 写BUFFER 合并插入SQL 减少repaint和reflow 减少交互 7214年8月25日星期⼀一
  73. 73. 如何对1亿个不重复的无符号整数进行排序? 7314年8月25日星期⼀一
  74. 74. 如何在只允许使用 128M内存 的情况下, 对1亿个不重复的无符号整数进行排序? 7414年8月25日星期⼀一
  75. 75. 下面这个书柜已经摆满了书,周边也没有 可供临时摆放书的地方,该如何整理? 7514年8月25日星期⼀一
  76. 76. 分治策略 压缩数据 原地操作 按需加载 及时释放 减少资源占用 7614年8月25日星期⼀一
  77. 77. 只保留必要的代码 优化循环 减少重复计算 减少交互,合并批处理 减少资源占用 小结 7714年8月25日星期⼀一
  78. 78. Q & A 7814年8月25日星期⼀一
  79. 79. 鱼与熊掌,不可兼得。 7914年8月25日星期⼀一
  80. 80. 4. 可读性 别人理解代码意图及逻辑所需要的时间 8014年8月25日星期⼀一
  81. 81. 为什么女生的裙子越短越好? 8114年8月25日星期⼀一
  82. 82. 8214年8月25日星期⼀一
  83. 83. 为什么函数体越短越好? 8314年8月25日星期⼀一
  84. 84. 8414年8月25日星期⼀一
  85. 85. 超出屏幕的部分会导致强迫记忆 函数的长度应该控制在⼀一屏之内 函数越短越好 8514年8月25日星期⼀一
  86. 86. 如何使下面的函数更短小? 8614年8月25日星期⼀一
  87. 87. 改写方法 8714年8月25日星期⼀一
  88. 88. 如何使下面的函数更短小? 8814年8月25日星期⼀一
  89. 89. 改写方法 8914年8月25日星期⼀一
  90. 90. 提出配置信息 抽出子函数 删除废弃的代码 删除不必要的注释 删除只使用⼀一次的变量 减少函数长度的方法 9014年8月25日星期⼀一
  91. 91. 你记得住多少家人的名字? • 我 • 父亲 • 母亲 • 爷爷 • 奶奶 • 曾祖父 9114年8月25日星期⼀一
  92. 92. 如何把⼀一段代码写得很高深? 9214年8月25日星期⼀一
  93. 93. 9314年8月25日星期⼀一
  94. 94. 在进入逻辑层次的时候需要入栈操作 随着层次增加,理解难度呈几何级数上升 函数体中的的逻辑层次不应超过2层 逻辑层次越少越好 9414年8月25日星期⼀一
  95. 95. 如何减少以下代码的逻辑层次? 9514年8月25日星期⼀一
  96. 96. 改写方法 9614年8月25日星期⼀一
  97. 97. 如何减少以下代码的逻辑层次? 9714年8月25日星期⼀一
  98. 98. 改写方法 9814年8月25日星期⼀一
  99. 99. 通过提前返回、短路操作减少if分支 用三元操作代替if...else... 使用子函数隐藏不必要暴露的细节 减少逻辑层次的方法 9914年8月25日星期⼀一
  100. 100. 如何使⼀一段代码怎么看也看不懂? 10014年8月25日星期⼀一
  101. 101. 下面的代码是干什么的? 10114年8月25日星期⼀一
  102. 102. 下面的代码是干什么的? 10214年8月25日星期⼀一
  103. 103. 改写之后 10314年8月25日星期⼀一
  104. 104. 下面的代码有什么疑问? 10414年8月25日星期⼀一
  105. 105. 改写结果 10514年8月25日星期⼀一
  106. 106. 消灭魔术直接量 使用富含信息、符合惯例的命名 在必要时引入临时变量进行说明 减少疑问和歧义 10614年8月25日星期⼀一
  107. 107. 写注释应该遵循那些原则? 10714年8月25日星期⼀一
  108. 108. 10814年8月25日星期⼀一
  109. 109. 10914年8月25日星期⼀一
  110. 110. 11014年8月25日星期⼀一
  111. 111. 注释代码用意何在? 11114年8月25日星期⼀一
  112. 112. 逐字翻译有无必要? 11214年8月25日星期⼀一
  113. 113. 记录容易忘记的事情 11314年8月25日星期⼀一
  114. 114. 对可疑的地方进行说明 11414年8月25日星期⼀一
  115. 115. 为大段代码做索引 11514年8月25日星期⼀一
  116. 116. 能不写注释,就不写注释 将逻辑之外的信息写入注释 说明为什么,而不是做了什么 为大段代码进行索引 合理的注释 11614年8月25日星期⼀一
  117. 117. 函数越短越好 逻辑层次越少越好 减少疑问和歧义 合理的注释 小结 11714年8月25日星期⼀一
  118. 118. Q & A 11814年8月25日星期⼀一
  119. 119. 代码,是写给人看的。 11914年8月25日星期⼀一
  120. 120. 5. 可维护性 在需求发生变更时所需要的修改量 12014年8月25日星期⼀一
  121. 121. 在很久很久以前,⼀一位技艺高超 的工匠奉命为法老雕⼀一座像…… 12114年8月25日星期⼀一
  122. 122. 他选中了⼀一块好地方,开工了…… 12214年8月25日星期⼀一
  123. 123. 五十年之后…… 12314年8月25日星期⼀一
  124. 124. 什么?需求又改了? 12414年8月25日星期⼀一
  125. 125. 美好的梦想 残酷的现实 12514年8月25日星期⼀一
  126. 126. 当水结冰(需求不再变化)后, 才能在上面行走(进行开发)。 12614年8月25日星期⼀一
  127. 127. 显性需求 隐性需求 提出的需求 12714年8月25日星期⼀一
  128. 128. 下面的代码有何改进空间? 12814年8月25日星期⼀一
  129. 129. 改进之后 12914年8月25日星期⼀一
  130. 130. 需求变化是常态 预测可能发生的变化 针对变化进行预设计 设计不足 vs 过度设计 拥抱变化 13014年8月25日星期⼀一
  131. 131. 工具的设计是如何进化的? 13114年8月25日星期⼀一
  132. 132. 13214年8月25日星期⼀一
  133. 133. 13314年8月25日星期⼀一
  134. 134. 13414年8月25日星期⼀一
  135. 135. Copy & Paste 是万恶之源 抽出配置 抽象基类 模板方法 公用widget & util 将修改限制在⼀一处 13514年8月25日星期⼀一
  136. 136. 维护⼀一个小孩有多难? 13614年8月25日星期⼀一
  137. 137. 13714年8月25日星期⼀一
  138. 138. 13814年8月25日星期⼀一
  139. 139. 下面的美国地图有什么问题? 13914年8月25日星期⼀一
  140. 140. 14014年8月25日星期⼀一
  141. 141. 哪辆自行车更容易维护? 14114年8月25日星期⼀一
  142. 142. 你在立交桥上迷路的可能性? 14214年8月25日星期⼀一
  143. 143. 武汉,航空路立交(3层) 14314年8月25日星期⼀一
  144. 144. 北京,西直门立交(3层) 14414年8月25日星期⼀一
  145. 145. 洛杉矶,法官哈利·普雷格森立交(4层) 14514年8月25日星期⼀一
  146. 146. 如何化简下面的代码逻辑? 14614年8月25日星期⼀一
  147. 147. 改写之后 14714年8月25日星期⼀一
  148. 148. 维护的难度与代码量成正比 将相关的代码聚合到⼀一起 逻辑简单的函数更容易维护 参数少的函数更容易维护 减少代码的复杂性 14814年8月25日星期⼀一
  149. 149. 谁会来改你的代码? 14914年8月25日星期⼀一
  150. 150. 美好的梦想 残酷的现实 15014年8月25日星期⼀一
  151. 151. 15114年8月25日星期⼀一
  152. 152. 15214年8月25日星期⼀一
  153. 153. 如何防止鸡蛋被打破? 15314年8月25日星期⼀一
  154. 154. 15414年8月25日星期⼀一
  155. 155. 在理解的基础上进行修改 命名准确达意,添加必要的注释 代码分层,业务之间互相隔离 用单元测试保证功能完整性 避免修改破坏已有功能 15514年8月25日星期⼀一
  156. 156. 拥抱变化 将修改限制在⼀一处 减少代码的复杂性 避免修改破坏已有功能 小结 15614年8月25日星期⼀一
  157. 157. Q & A 15714年8月25日星期⼀一
  158. 158. 变化是唯⼀一不会变化的事情。 15814年8月25日星期⼀一
  159. 159. 6. 可复用性 代码可使用场景的有限性 15914年8月25日星期⼀一
  160. 160. 生活中我们如何应对需求变化? 16014年8月25日星期⼀一
  161. 161. 16114年8月25日星期⼀一
  162. 162. 16214年8月25日星期⼀一
  163. 163. 16314年8月25日星期⼀一
  164. 164. 16414年8月25日星期⼀一
  165. 165. 16514年8月25日星期⼀一
  166. 166. 如何使下面的代码可复用? 16614年8月25日星期⼀一
  167. 167. 改写之后 16714年8月25日星期⼀一
  168. 168. 任何可能变化的值都是配置 不用更改代码就可满足新的需求 容易理解,对用户友好 将可修改的内容放在⼀一起 配置和代码分离 16814年8月25日星期⼀一
  169. 169. 如何做出五个彩色灯泡? 16914年8月25日星期⼀一
  170. 170. + 17014年8月25日星期⼀一
  171. 171. 有位客人对鸡蛋过敏, 该怎么做扬州炒饭? 17114年8月25日星期⼀一
  172. 172. 发现事物与问题的本质 抽象基类,解决通用问题 用继承类和装饰模式实现业务需求 需求分级,实现分层 17214年8月25日星期⼀一
  173. 173. 你知道哪些高复用性的产品? 17314年8月25日星期⼀一
  174. 174. 17414年8月25日星期⼀一
  175. 175. 17514年8月25日星期⼀一
  176. 176. 找出访问次数最多的10个IP 17614年8月25日星期⼀一
  177. 177. 只做⼀一件简单的事,并把它做好 面向职责而非业务设计 面向接口而非实现编程 工厂、策略 、模板方法、组合 代码颗粒化 17714年8月25日星期⼀一
  178. 178. 为什么我做了以上所说的⼀一切, 但是可复用性还不高? 17814年8月25日星期⼀一
  179. 179. 17914年8月25日星期⼀一
  180. 180. QWERTY DVORAK 18014年8月25日星期⼀一
  181. 181. 为什么这种手机充电器被淘汰了? 18114年8月25日星期⼀一
  182. 182. + 18214年8月25日星期⼀一
  183. 183. 普通家庭如何购买螺丝刀? 18314年8月25日星期⼀一
  184. 184. …… 18414年8月25日星期⼀一
  185. 185. 18514年8月25日星期⼀一
  186. 186. 18614年8月25日星期⼀一
  187. 187. 使用统⼀一且标准化的接口 引入间接性( 代理、中介、桥接) 依赖注入、控制倒转 减少依赖,松散耦合 18714年8月25日星期⼀一
  188. 188. 配置和代码分离 需求分级,实现分层 代码颗粒化 减少依赖,松散耦合 小结 18814年8月25日星期⼀一
  189. 189. Q & A 18914年8月25日星期⼀一
  190. 190. 生命不息,重构不止。 19014年8月25日星期⼀一
  191. 191. 8. 推荐书籍 本次分享内容的主要来源 19114年8月25日星期⼀一
  192. 192. 19214年8月25日星期⼀一
  193. 193. 谢谢大家! 19314年8月25日星期⼀一

×