复合名是一种代码臭味
来源:互联网 发布:mac如何下载优酷视频 编辑:程序博客网 时间:2024/04/25 10:03
你有像 textLength、table_name 或者 current-user-email 这样命名变量吗?它们都是由超过一个单词组成的复合名。虽然它们看起来比 name、length 或者 email 更具有描述性,但我强烈建议避免使用它们。我认为一个比单个名词更复杂的变量名是代码的臭味。为什么?因为我们通常给变量一个复合名是当它的作用范围是如此的大而复杂以至于一个简单的名词听起来会模糊不清。一个大而复杂的范围是一种明显的代码臭味。
变量的范围是指它可见的地方,比如一个方法,举个例子。看这个Ruby类:
class CSV def initialize(csvFileName) @fileName = csvFileName end def readRecords() File.readLines(@fileName).map |csvLine| csvLine.split(',') end endend
变量 csvFileName 的范围是方法 initialize(),它是CSV类的构造方法。它为什么需要包含三个词的复合名称呢?这不是已经很清楚了吗,它是类CSV的一个单参构造函数要求的用逗号分隔的一个文件的名字。我将它重命名为 file。
接下来, @fileName 的范围是整个CSV类。重命名为一个单个变量 @file 在类里不会引入任何的混淆。依然很清晰它是我们处理的文件。同样的情况也存在于变量csvLine。很清晰它是我们要处理的CSV行。csv前缀在这儿是多余的。这是我重构后的类:
class CSV def initialize(file) @file = file end def records() File.readLines(@file).map |line| line.split(',') end endend
现在它看起来清晰而且简洁。
如果你不能做这样的重构,说明你的作用范围太大或者太复杂。一个理想的方法应该能处理多达五个变量,一个理想的类应该能封装到五个属性。
如果我们有五个变量,难道我们找不到五个名词来命名它们吗?
亚当和夏娃没有姓。在伊甸里他们是对一无二的,正如旧约里的很多其他人物一样。后来发明了姓,是为了解决混淆。为了保持你的方法和类干净可靠,防止歧义,努力尝试给你的变量和方法一个独一无二的单字名,就像亚当和夏娃被叫时你知道是谁。
ps: 此外,冗余的变量同样邪恶。
本文是一篇译文,点击《A Compound Name Is a Code Smell》查看原文,如有翻译不当的地方欢迎指出。如需转载,请标明原文和译文的出处,谢谢。
微信扫一扫 查看更多内容
- 复合名是一种代码臭味
- 8种臭味代码
- 注释==代码臭味
- 代码是一种艺术
- 让单元测试“嗅出”代码的臭味
- 代码的二十二道臭味
- 调试代码是一种乐趣
- 好的代码是一种享受
- 好的代码风格是一种美!
- MVC是一种用于表示层设计的复合设计模式
- MVC是一种用于表示层设计的复合设计模式
- hibernate复合主键代码
- CodeSmith 是一种基于模板的代码生成工具
- 修改别人的代码是一种找虐
- 在网吧写代码是怎样一种体验?
- 在即将疯狂扩招25000名员工的IBM工作是怎样的一种体验?
- 40 岁了还在写代码,是一种幸福,还是一种悲哀?
- 40 岁了还在写代码,是一种幸福,还是一种悲哀?
- LeetCode387. First Unique Character in a String
- 因为喜欢、所以坚持
- cocos2dx 3.12 Windows模拟器显示菜单栏
- 图之最小生成树
- View的坐标系
- 复合名是一种代码臭味
- 第二章 装配Bean之spring配置可选方案及自动化装配bean
- java共享锁实现原理及CountDownLatch解析
- java 实体类模板
- 更新AndroidStudio后,运行原来可以运行的程序时,出现 Error running app: Instant Run requires 'Tools | Android | Enable A
- KNN(K-最近邻)
- 自定义UICollectionViewCell中控件为nil
- rethat-linux 学习3:配置tomcat环境
- AC自动机(2)--hdu2896(病毒侵袭)(基础题)