复合名是一种代码臭味

翻译 2016年08月28日 23:42:16

你有像 textLengthtable_name 或者 current-user-email 这样命名变量吗?它们都是由超过一个单词组成的复合名。虽然它们看起来比 namelength 或者 email 更具有描述性,但我强烈建议避免使用它们。我认为一个比单个名词更复杂的变量名是代码的臭味。为什么?因为我们通常给变量一个复合名是当它的作用范围是如此的大而复杂以至于一个简单的名词听起来会模糊不清。一个大而复杂的范围是一种明显的代码臭味。

变量的范围是指它可见的地方,比如一个方法,举个例子。看这个Ruby类:

class CSV
  def initialize(csvFileName)
    @fileName = csvFileName
  end
  def readRecords()
    File.readLines(@fileName).map |csvLine|
      csvLine.split(',')
    end
  end
end

变量 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
  end
end

现在它看起来清晰而且简洁。

如果你不能做这样的重构,说明你的作用范围太大或者太复杂。一个理想的方法应该能处理多达五个变量,一个理想的类应该能封装到五个属性。

如果我们有五个变量,难道我们找不到五个名词来命名它们吗?

亚当和夏娃没有姓。在伊甸里他们是对一无二的,正如旧约里的很多其他人物一样。后来发明了姓,是为了解决混淆。为了保持你的方法和类干净可靠,防止歧义,努力尝试给你的变量和方法一个独一无二的单字名,就像亚当和夏娃被叫时你知道是谁。

ps: 此外,冗余的变量同样邪恶。

本文是一篇译文,点击《A Compound Name Is a Code Smell》查看原文,如有翻译不当的地方欢迎指出。如需转载,请标明原文和译文的出处,谢谢。


微信扫一扫,查看更多内容
微信扫一扫 查看更多内容

代码的二十二道臭味

  这是一篇关于阅读《重构,改善既有代码的设计》后的笔记,记住了代码发臭的二十二种形式,并形成这样的意识,自己每次写代码的时候都能时刻提醒自己代码是否在发臭,那么我们的生活会更轻松。重构不...

8种臭味代码

千里之行,始于足下,千里之堤,毁于蚁穴,做好设计的第一步就是写好你的代码,博文8 Signs your code sucks总结了代码中第一个感觉的臭味,让你能够于细微之处发现软件的质量问题。 ...

一种复合式TEV传感器

  • 2014年04月07日 12:31
  • 11.07MB
  • 下载

Java 比继承更好的一种机制 —— 复合

本文结合《Effective Java》第四章条目16和自己的理解及实践,讲解了Java继承机制的缺陷和替代方案,文章发布于专栏Effective Java,欢迎读者订阅。...

MVC是一种用于表示层设计的复合设计模式

它们之间的交互有以下几种:       1.当用户在视图上做任何需要调用模型的操作时,它的请求将被控制器截获。       2.控制器按照自身指定的策略,将用户行为翻译成模型操作,调用模型相应逻辑...

JPA复合主键另一种实现--联合约束

前言关于复合主键一般是三种方式,但必须创建复合主键类,然后通过注解的方式完成,这三种方式网上很容易找到,这里主要记录自己使用时的一些坑和项目中的特殊需求。 结合JPA使用时,关于Repository类...

一种基于闪存的数据库复合存储模型的论文总结

数据库复合存储模型:同时包括闪存和磁盘,数据根据访问特征分配,使用地址映射表访问,根据访问的统计和设备的特点动态调整页面分布从而提高数据库性能。 结构:数据库的查询层逻辑保持原样,外存设备由两种共...

打印(复合)容器内容的代码.

近期写一些代码经常需要打印出容器结果,主要是给自己看看结果正确性。 不想每次自己写几层for,所以写了下面的代码。 template void printcon(T& con, const str...
  • j8daxue
  • j8daxue
  • 2015年05月13日 13:27
  • 204

Sql Server 2005数据库sql代码写外键、复合键作主键

一、环境是sql server 2005,首先自己创建了一个ClassDB的数据库 二、运行以下的sql代码   use ClassDB drop table enrol /*引用studen...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:复合名是一种代码臭味
举报原因:
原因补充:

(最多只允许输入30个字)