今天,Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的一些他的话。
为什么我们需要有质量的代码?
-
敏捷开发方法是用来应付那些要求代码做大量改动的反馈信息的方法。
-
如果程序没有用一种好的表达方式来表现,那程序会很难读,难维护,难修改。
什么是代码异味?
-
代码异味是一种由写的很差的代码引起的一种有臭味的感觉,一种程序什么地方会有问题的感觉
-
异味更多的是来自一种直觉,而不是一种有据可查的标准,当你看到有味的代码时你就“感觉”到了
-
如果你不把异味清除,不久之后你就会习惯这种气味,不再对它有察觉
-
用任何语言都能写出有异味的代码:即使最简单安全的语言,你也能做出天才才能想出的蠢事:)
-
我们经常会意识不到自己在写很臭的代码,经常需要外人为我们指出这点
-
边注:如果你不想刻意去批评某人的程序,不要说“太愚蠢了”,要说“哦,这很有意思…。可有一种更好的方法你知道吗”
重复的代码
-
会引起程序里面多个地方相同的错误
-
印度小伙:每两个月我们都会把这相同的错误修改一次
-
Venkat:你们去掉了重复的代码了吗?
-
印度小伙:你说的这个方法不错!
不必要的复杂
异常处理
-
问:有什么比一个空的异常捕捉代码更糟糕的?
-
try{... } catch (Exception e){}
-
答:一个带有注释的空异常捕捉代码!
-
try{... } catch (Exception e){// is this required? }
-
Java的异常检查:好还是不好?
-
如果你不想处理一个异常,就把它传递下去
-
如果你想捕捉两个异常,使用两个catch代码,不要只写一个而用If条件处理
Switch语句& 按类型的条件判断
-
Switch语句和按类型的条件判断通常可以用多形性来代替
长方法
-
你不能在一屏上看到整个方法
-
这通常意味着一个方法承担这多重任务
-
难于调试
-
不可测试
-
难于重用-> 导致程序员从方法的其它地方拷贝粘贴出重复的代码
-
复杂的条件语句-> 挑战大脑的逻辑分析能力
-
方法长度:组织归纳水平比控制代码行数更重要
方法组成模式
无用的注释
-
让代码自我表白
-
标注为什么这样,而不是如何这样
-
对方法表现进行描述等于重复表现
-
这样的注释等于重复写一遍代码
-
长方法里用来描述这个方法有不同的功用的注释
-
IDE排泄物:IDE自动产生的注释空白占位符
-
糟糕的注释通常产生于TDD*
-
*(TDD:Threat driven development,恐吓驱动开发)——你应该为方法的表象写注释,你应该为长方法写注释,等
-
产品里的注释:
变量名称
-
使用能表意的名称
-
不要用单个字母做名称
-
也不要使用太长的名称
继承
-
继承更多的是被滥用了
-
组合通常优于继承
-
在一对一关系中使用继承,满足Liskov替换原则
-
不要用继承来实现方法重用
-
重用方法时,委托是个更好的选择
粘手的语言
最臭的代码
-
冗长的类
-
重复的代码
-
淘汰的方法
-
不必要的塑型(cast)
-
过度使用设计模式
代码除味
-
代码复查!
-
可使用结对编程
-
但要保持结对伙伴的经常变动,否则你会习惯你的气味,不再会有察觉
-
结对伙伴一、两天调换一次
一些设计原则
一些参考书籍
问和答
-
关于使用代码检测工具,例如PMD:这样的工具非常的有用,它能让你捕捉到很直接的问题,使你的代码复查工作专注于高层面的设计原则问题
-
关于IDE上附加的工具:不要自己去运行它们。让这些工具在后台自动的运行(或智能化)
-
动态语言里需要重构吗:动态语言里没有太多的自动重构工具,但程序员仍然应该手动的重构
-
关于动态语言的设计模式:每种语言都有自己的模式和特色。例如:smalltalk的execute around method模式
-
关于掌握多种语言
- 你应该知道处理一个问题的多种范式,多种风格和多种方式
- 一种语言中学到的特色方法应用到其它语言里
- 知道各种不同方式的各自风险
-
关于编程语言趋势:对函数性编程,移动设备编程兴趣浓厚
-
关于著书:长时间的思考书中的各项主题,多做这方面话题的讨论,吸取精华。当开始动手去写时,已经胸有成竹,2周内把书写成
-
关于思考文献:思考文献很有用,但你也要多看看批评性的思考性文章,它们是关于你如何去思考的(double loop learning?)
-
关于学习:在用户组里跟其它人合作,交流,讨论。你并不能学到所有的东西,但要努力缩小自己的“你不知道你不知道的东西”,让它成为“你知道你不知道的”
转载自:http://www.iteye.com/magazines/11
分享到:
相关推荐
6. **代码优化**:通过识别和消除代码异味,开发者可以进行代码重构,优化程序性能,提高代码效率。 7. **开源项目**:D2Smells是开源的,意味着它的源代码可供公众查看、学习和贡献,促进社区协作和代码共享。 8....
重构通常包括提取函数、拆分类、移除重复代码、简化条件表达式等步骤,这些操作有助于消除代码异味,提高代码的结构清晰度。 在"重构:改善既有代码的设计(中英文)"这个文件中,我们可以期待找到关于重构的详细...
随着项目发展,定期进行代码重构,优化代码结构,消除代码异味,保持代码的整洁。 9. **代码审查** 定期进行同行代码审查,发现潜在问题,提升团队整体编码水平。通过他人的视角,可以发现自身忽视的问题。 10. ...
这种改进可以包括提取函数、移动函数、提取类等操作,旨在消除代码异味,增强代码的内聚性和耦合性。 1. **代码异味**:书中列举了各种代码异味,如重复代码(Duplicated Code)、过长函数(Long Method)、过大的...
重构的主要目标是消除代码异味(Code Smell),这些异味可能是冗余代码、复杂的条件逻辑、重复的代码块或者是难以理解的命名。通过识别并解决这些问题,重构有助于提高代码的可读性和可维护性,使得团队协作更加高效...
它有助于消除代码异味,提高代码质量。书中可能包含如何进行有效的代码重构策略和技巧。 3. **设计模式**:设计模式是解决常见编程问题的标准化解决方案。书中可能会涵盖一些常见的设计模式,如工厂模式、单例模式...
重构则是在不影响代码功能的前提下,优化代码结构和性能,消除代码异味,使其更易于理解和维护。定期进行代码评审和重构,可以持续改善代码库,确保代码的长期可维护性。 总之,在敏捷开发中,通过实施统一的编码...
这一过程有助于消除代码异味,优化代码结构。 4. **错误处理**:作者讨论了错误处理的最佳实践,包括何时使用异常、如何有效地抛出和捕获异常,以及如何编写健壮的错误处理代码。 5. **测试**:书中提到了单元测试...
这通常是为了消除代码异味、提高代码的可读性和可测试性。例如,使用提取方法、提取类、替换魔术数字等重构技术,可以使代码更易于理解和维护。同时,遵循SOLID原则(单一职责、开闭、里氏替换、接口隔离和依赖倒置...
重构可以帮助我们逐步消除代码异味,提升设计模式的使用,使得代码更符合面向对象的原则,如单一职责原则(Single Responsibility Principle)、开闭原则(Open-Closed Principle)等。 书中详细介绍了各种重构技术,...
通过使用版本控制系统、识别并消除代码异味、降低函数复杂度以及重构代码等方法,工程师和科学家可以显著提高代码质量和软件项目的成功率。这些技术不仅适用于MATLAB等特定编程环境,而且可以在任何编程语言和环境中...
通过识别和消除代码异味,可以提高代码的可读性和可维护性。 6. **系统架构与模块化**:Feathers阐述了如何分析系统的架构,识别关键组件,并通过模块化来降低复杂度。这有助于将大型代码库分解为更易于管理的部分...
通过小规模的、有系统的修改,可以消除代码异味(code smell),即那些表明代码可能存在潜在问题的迹象。这些修改包括提取方法、封装字段、替换魔术数字、消除重复代码等。 在Java中,利用IDE如Eclipse或IntelliJ ...
这些重构模式通常是对代码的一种微小调整,例如提取函数、移动函数、提取类等,它们旨在消除代码异味,使代码更易于理解。同时,马丁·福勒强调了单元测试在重构过程中的重要性,因为重构可能会引入错误,而持续的...
通过重构,我们可以改进代码结构、消除代码异味、提高代码可读性和可维护性。重构对于软件项目的长期发展至关重要,因为随着时间的推移,代码库会逐渐变得复杂难懂,这会增加后期维护的成本和难度。因此,定期进行...
在面向对象编程中,重构通常是为了消除代码异味(Code Smell),这些异味可能是冗余代码、过长函数、复杂的条件表达式等。通过对这些异味进行识别并应用适当的重构模式,可以逐步改进代码设计,使其更符合设计原则,...
本章提供了识别和消除代码异味的策略,例如去除类型代码、简化条件语句,以及重构代码结构,帮助开发者创建更健康、更易于维护的代码库。 ### 第4章 保持代码简洁 #### 简洁与高效 代码的简洁性直接影响其可读性...