Venkat 演讲翻译:你要清除代码中的异味

今天,Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的一些他的话。

为什么我们需要有质量的代码?

  • 敏捷开发方法是用来应付那些要求代码做大量改动的反馈信息的方法。
  • 如果程序没有用一种好的表达方式来表现,那程序会很难读,难维护,难修改。

什么是代码异味?

  • 代码异味是一种由写的很差的代码引起的一种有臭味的感觉,一种程序什么地方会有问题的感觉
  • 异味更多的是来自一种直觉,而不是一种有据可查的标准,当你看到有味的代码时你就“感觉”到了
  • 如果你不把异味清除,不久之后你就会习惯这种气味,不再对它有察觉
  • 用任何语言都能写出有异味的代码:即使最简单安全的语言,你也能做出天才才能想出的蠢事:)
  • 我们经常会意识不到自己在写很臭的代码,经常需要外人为我们指出这点
    • 边注:如果你不想刻意去批评某人的程序,不要说“太愚蠢了”,要说“哦,这很有意思…。可有一种更好的方法你知道吗

重复的代码

  • 会引起程序里面多个地方相同的错误
  • 印度小伙:每两个月我们都会把这相同的错误修改一次
  • Venkat:你们去掉了重复的代码了吗?
  • 印度小伙:你说的这个方法不错!

不必要的复杂

  • 程序员本质上讲高兴去处理复杂的问题
  • 复杂最恐怖

异常处理

  • 问:有什么比一个空的异常捕捉代码更糟糕的?
    • try { ... } catch (Exception e) { }
  • 答:一个带有注释的空异常捕捉代码!
    • try { ... } catch (Exception e) { // is this required? }
  • Java的异常检查:好还是不好?
  • 如果你不想处理一个异常,就把它传递下去
  • 如果你想捕捉两个异常,使用两个catch代码,不要只写一个而用If条件处理

Switch语句 & 按类型的条件判断

  • Switch语句和按类型的条件判断通常可以用多形性来代替

长方法

  • 你不能在一屏上看到整个方法
  • 这通常意味着一个方法承担这多重任务
  • 难于调试
  • 不可测试
  • 难于重用 -> 导致程序员从方法的其它地方拷贝粘贴出重复的代码
  • 复杂的条件语句 -> 挑战大脑的逻辑分析能力
  • 方法长度:组织归纳水平比控制代码行数更重要

    方法组成模式

    • 方法里的所有语句都必须处在同一个归纳层次上

    无用的注释

    • 让代码自我表白
    • 标注为什么这样,而不是如何这样
    • 对方法表现进行描述等于重复表现
    • 这样的注释等于重复写一遍代码
      • i += 1 // 递增
    • 长方法里用来描述这个方法有不同的功用的注释
      • 把里面的功能片段提取成小方法 & 删除注释
    • IDE排泄物:IDE自动产生的注释空白占位符
    • 糟糕的注释通常产生于TDD*
      • * (TDD:Threat driven development,恐吓驱动开发)—— 你应该为方法的表象写注释,你应该为长方法写注释,等
    • 产品里的注释:
      • // 上帝保佑,我实在不知道这是什么意思

    变量名称

    • 使用能表意的名称
    • 不要用单个字母做名称
    • 也不要使用太长的名称

    继承

    • 继承更多的是被滥用了
    • 组合通常优于继承
    • 在一对一关系中使用继承,满足Liskov替换原则
    • 不要用继承来实现方法重用
    • 重用方法时,委托是个更好的选择

    粘手的语言

    • 这种语言更容易导致犯错误

    最臭的代码

    • 冗长的类
    • 重复的代码
    • 淘汰的方法
    • 不必要的塑型(cast)
    • 过度使用设计模式

    代码除味

    • 代码复查!
      • 写出之后尽快进行
      • 要增量进行
      • 要复查测试用例
    • 可使用结对编程
      • 但要保持结对伙伴的经常变动,否则你会习惯你的气味,不再会有察觉
      • 结对伙伴一、两天调换一

    一些设计原则

    • 高聚合
    • 低耦合
    • Demeter定律 [不要告诉我,我会通知你]
    • Liskov替换原则
    • 先让它跑起来,再让它无误,再让它快速
    • 开发/闭合原则
    • 反向依赖
    • 单一责任原则

    一些参考书籍

    • 代码整洁之道(Clean Code)
    • 代码大全(Code Complete) 2
    • 程序员修炼之道(The Pragmatic Programmer)
    • 敏捷开发修炼之道(Practices of an Agile Developer)
    • Smalltalk Best Practice Patterns
    • 实现模式(Implementation Patterns) (from @protoiyer)

    问和答

    • 关于使用代码检测工具,例如PMD:这样的工具非常的有用,它能让你捕捉到很直接的问题,使你的代码复查工作专注于高层面的设计原则问题
    • 关于IDE上附加的工具:不要自己去运行它们。让这些工具在后台自动的运行(或智能化)
    • 动态语言里需要重构吗:动态语言里没有太多的自动重构工具,但程序员仍然应该手动的重构
    • 关于动态语言的设计模式:每种语言都有自己的模式和特色。例如:smalltalk的execute around method模式
    • 关于掌握多种语言
      • 你应该知道处理一个问题的多种范式,多种风格和多种方式
      • 一种语言中学到的特色方法应用到其它语言里
      • 知道各种不同方式的各自风险
    • 关于编程语言趋势:对函数性编程,移动设备编程兴趣浓厚
    • 关于著书:长时间的思考书中的各项主题,多做这方面话题的讨论,吸取精华。当开始动手去写时,已经胸有成竹,2周内把书写成
    • 关于思考文献:思考文献很有用,但你也要多看看批评性的思考性文章,它们是关于你如何去思考的(double loop learning?)
    • 关于学习:在用户组里跟其它人合作,交流,讨论。你并不能学到所有的东西,但要努力缩小自己的“你不知道你不知道的东西”,让它成为“你知道你不知道的”

    原文:http://www.aqee.net/2011/05/18/cleaning-up-code-smells/

转载于:https://www.cnblogs.com/helenR/p/code_smell.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266等模块

模块讲解学习视频可参照:https://space.bilibili.com/323745961?spm_id_from333.788.b_765f7570696e666f.1 作者:叁议电子 目录ESP8266 WIFI模块介绍电脑操作ESP8266单片机上网ESP8266 WIFI模块介绍 电脑操作ESP8266 单片机上网

html5在线音乐列表播放器,HTML5列表音乐播放器SMusic

插件描述:一款基于HTML5、Css3的列表式音乐播放器,包含列表,音量,进度,时间,歌词展示以及模式等功能,不依赖任何库SMusic使用方法这是一款基于HTML5以及CSS3的列表式音乐播放器,增加…

unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi

unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /Users/xq/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9 可能是下载时网络原因造成文件缺失 解决方法: cd /Users/xq/.gradle/w…

WIFI小车APP

对应这篇文章&#xff1a;433M射频遥控灯、震动感应灯、WIFI避障小车 目录代码概要activity_contrl.xmlContrlActivity.javaNetUtils.java详细工程代码下载代码概要 activity_contrl.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android&qu…

[Web App]必胜客宅急送产品设计思路介绍[转]

O2O模式是餐饮业在移动消费趋势下主动拥抱互联网的方向&#xff0c;迎合餐饮消费者从以往经验判断为主转变为依靠移动设备、LBS、社交网络进行立体决策的过程。App成为联系消费者和餐饮业的重要纽带&#xff0c;承载着在O2O双向流程的闭环中加深消费者对品牌的认同和感情认知的…

yara 模式匹配 android,YARA——恶意软件模式匹配利器

YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具(由virustotal的软件工程师Victor M. Alvarezk开发)&#xff0c;使用YARA可以基于文本或二进制模式创建恶意软件家族描述信息&#xff0c;当然也可以是其他匹配信息。YARA的每一条描述或规则都由一系列字符…

12.6今日任务

查询资料&#xff0c;查询如何包装成软件转载于:https://www.cnblogs.com/IENHOLT/p/10147742.html

C语言extern关键字(去使用外部全局变量、函数)

参考&#xff1a;C语言正确使用extern关键字 作者&#xff1a;xingjiarong 发布时间&#xff1a;2015-08-14 08:37:33 网址&#xff1a;https://blog.csdn.net/xingjiarong/article/details/47656339 目录1、引用同一个文件中的变量2、引用另一个文件中的变量3、引用另一个文件…

使用Raphael实现html中绘图

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff1a;下载Raphael的javascript库&#xff1a;http://raphaeljs.com/。或者在html页面<head></head>&#xff1a;如下 <script src"http://www.zfanw.com/blog/raphael.js"></…

ITSS认证对企业的意义

在数字化时代&#xff0c;信息技术已经成为企业发展的重要驱动力。ITSS&#xff08;信息技术服务标准&#xff09;认证&#xff0c;作为信息技术服务领域的权威认证&#xff0c;对企业的意义非凡。本文将从提高服务质量、提升企业竞争力、优化管理体系、保障信息安全等方面&…

vivo手机刷机鸿蒙,捡到vivo手机如何刷机

捡到手机&#xff0c;首先建议归还给失主&#xff01;然后如果需要刷机的话&#xff0c;建议可以清除账户密码&#xff1a;可以尝试在手机关机状态同时按住音量上键以及电源键3到4秒手机出现vivo手机标志后&#xff0c;放开按键进入recovery模式&#xff0c;先选择wipe data/fa…

UEditor 百度富文本编辑器 .Net实例

转自 http://download.csdn.net/download/hdsslxl/6740605 1、UEditor 百度富文本编辑器完整版 .Net实例 已解决上传图片问题。 2、内附完整demo实例&#xff0c;附带txt讲解说明及UEditor常见问题解决方案。 3、已经调试好的百度文本编辑器实例&#xff0c;用户体验不错&#…

详解ROM和RAM

参考&#xff1a;详解ROM和RAM 作者&#xff1a;嵌入式实验楼 网址&#xff1a;https://mp.weixin.qq.com/s/FhUxMLeAxkhWe5m-gV_hMw 目录1、只读存储器&#xff1a;ROM2、随机访问存储器&#xff1a;RAM内存是计算系统最重要的元素&#xff0c;因为没有它&#xff0c;计算机就…

ubuntu解压和压缩文件

.tar 解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName&#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09;———————————————.gz解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d…

python递归查询并列出目录

第一种方法&#xff1a;>>> import os #导入模块 >>> os.walk(/tmp/test/testdir) #os的walk函数对象 <generator object walk at 0x1e8a960> >>> for i in os.walk(/tmp/test/testdir): #for循环打印出目录的文件 ... print i ... (/tmp…

html 输入框防止自动记忆,网页输入框input填写内容自动记忆功能怎么去除

我们在做前端的html网页模板的时候&#xff0c;免不了要制作一些输入框&#xff0c;供使用者输入信息实现人机交互。一般情况下我们都会使用如下的HTML代码来生成单行输入框&#xff1a;这是一个很简单的HTML代码&#xff0c;其效果就是可以在前端页面输出一个输入框供用户输入…

深入理解STM32内存管理

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

django ORM中的RelatedManager(关联管理器)

关联管理器应用在 一对多的表 或者 多对多的表 多对多表中的用法: 在多对多的表中 正向查询 #基于对象的查询 #正查 # author_obj Author.objects.get(id1) # print(author_obj) #<Author object: 1 吴晓波> # print(author_obj.book_set.all()) #出版过的所有的书 …

html 手写字效果,canvas画布实现手写签名效果的示例代码

最近项目中涉及到移动端手写签名的功能需求&#xff0c;将实现代码记录于此&#xff0c;供小伙伴们参考指摘哦~HTML代码&#xff1a;手写区清除确定CSS样式&#xff1a;.mSign_signMark_box{padding: 15px 15px 26px 15px;}.mSign_signMark_footer{max-width:640px;margin:0 au…

ADO.NET 快速入门(十五):ADO 应用转换为 ADO.NET

这是一个已经移植到 .NET 的 ADO 应用的例子。也演示了单向、只读、快速 DataReader 的使用。它演示如何使用 DataView 类从 DataSet 获取一个 Table 和 操作一个类似于旧的 ADO 记录集模型。请记得&#xff0c;ADO 记录集仅仅包含一个 Table 的数据&#xff0c;但是 ADO.NET D…