关闭

复合名是一种代码臭味

标签: 面向对象
247人阅读 评论(0) 收藏 举报
分类:

你有像 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》查看原文,如有翻译不当的地方欢迎指出。如需转载,请标明原文和译文的出处,谢谢。


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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7036次
    • 积分:431
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:3篇
    • 译文:5篇
    • 评论:0条
    文章分类