是否鼓励使用单字母变量?[关闭]


13

Java是否鼓励使用单字母变量?在代码段或教程中,您经常会看到它们。我无法想象使用它们会受到鼓励,因为它使代码相对难以阅读,而且我从未见过将它们用于其他编程语言!


3
是的,没有。完全取决于情况。
Zavior




1
并不总是使代码更难阅读。例如,当您基于数学方程式实现代码时,通常使用与方程式相同的变量名称是有意义的。(评论指向要在其中找到原始方程式的论文/文本,或者,如果您像我一样,有时会在其中包含LaTeX代码。)
jamesqf 2015年

Answers:


32

正确命名事物很难。很难。如果您以另一种方式看待它,则也可以认为正确命名的事物很重要。(否则,为什么要花点功夫命名呢?)

但是,有时候,事物的名称并不重要。例如,这就是为什么我们拥有诸如匿名函数(“ lambdas”)之类的东西的原因:因为有时仅仅为它们命名是不值得的。

有很多示例,其中单个字母(或非常短的)变量名是合适的:

  • ijklfor循环指数
  • k以及v地图中的键和值
  • n对于一个数字(例如Math.abs(n)
  • abc对任意对象(例如,在max(a, b)
  • e对于通用for each循环中的元素
  • f 用于高阶函数中的函数
  • p 用于过滤器中的谓词功能
  • TT1T2,...类型变量
  • E 用于表示集合元素类型的类型变量
  • R 用于表示函数结果类型的类型变量
  • ex对于catch子句中的例外
  • op 用于在地图或折叠中进行操作
  • 在字母后面附加s表示复数的字母,即集合(例如,ns用于数字的集合,xs以及ys用于任意两个通用对象的集合)

我从未见过它们被其他编程语言使用!

在我所知道的几乎每种语言中,它们都很常见(也可能在我所不知道的任何语言中)。Haskell,F#,ML,Ruby,Python,Perl,PHP,C#,Java,Scala,Groovy,Boo,Nemerle, D,Go,C ++,C,随便命名。


5
-1使用1个字母的变量名称是惰性编程。有时候懒惰是可以的,但是如果您要进入循环索引kl处于循环索引中,那就太过分了(您不应该从那么多嵌套循环开始;将它们提取到函数中)。就个人而言,我从来没有使用超过每个函数一个1字母的变量,但我拍的0
BlueRaja -丹尼Pflughoeft

另外,llen用于长度和arr数组(例如:)for(var i=0; l=arr.length; i<l; i++)。另外,当您引用一个函数时,fn可以用代替f
伊斯梅尔·米格尔

4
@ BlueRaja-DannyPflughoeft我更喜欢将其视为高效的编程。Jorg可能会在什么时候适合使用单个字母(不仅是在哪里)方面进行扩展,但是老实说,我想大多数程序员会以不同的方式来区分。至于循环索引,我可以辩解说,任何索引不需要具有语义值的名称的代码都足够简单,足以证明多层次嵌套优于不必要的提取。它们也可以在单独的循环中使用,以避免Nelson提出可能的范围问题。
2015年

2
@Lilienthal:代码应易于读取,而不能高效编写。通常情况下,它们是同一回事,但并非总是如此。
BlueRaja-Danny Pflughoeft 2015年

@ BlueRaja-DannyPflughoeft并非在所有程序中都没有,但是我看不到Jorg的建议有什么问题。正如基利安(Killian)所说:“任何更长的时间都不可能使语义变得更加明显,但阅读时间将更长。” 但这可能很大程度上取决于个人喜好和风格。
2015年

20

如果循环不执行任何操作,但使用变量进行计数

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

那是的,这是您可以使用的最佳名称。更长的时间可能无法使语义变得更加明显,但需要花费更长的时间来阅读。

如果在循环使用变量,则有意义的名称可能会有用。

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

如果在方法范围内使用变量,则其名称应更长;如果在全班范围内使用它,则其名称最好完全不言自明,否则几乎可以肯定会降低代码的清晰度。

简而言之,变量的范围越大,其名称就必须越长。


老实说,我已经到了我将不使用一个字符变量名,句号的地步。我尝试使用能说明用法的名称,即使是计数器也是如此。例如,我通常会index在遍历数组时使用一个名为named的变量。
迈克尔

13
@Michael:我认为,Programming Jargon是它自己的语言,不适合英语。在该语言中,i是一个具有精确定义含义的恰当单词,即“您不必担心太多的索引”。但是我想这是一个熟悉的问题。如果你读了很多哈斯克尔的,你会成为习惯于阅读m单子f仿函数x一些对象xs清单x小号等等。
约尔格W¯¯米塔格

2
只是一个很大的警告。仅当语言具有适当的变量作用域时,单字母变量名才可以。您显然会问:“哪种语言没有适当的作用域?”。好吧,我花了三个小时来了解JavaScript不会在FOR循环中确定变量的范围。使用相同的变量名在for循环内的for循环中进行尝试。这会让你大吃一惊。
尼尔森

@Nelson:这个问题和这个答案都是关于Java的。显然,不同的语言可能会有一些不同的考虑。(JavaScript与Java语言不同。)
ruakh 2015年

只要有最合理的含义,我都会使用单字母变量名称,但是对于不同意i仅使用变量进行计数的循环,我并不认为这是“您可以使用的最佳名称”。在这种情况下,我宁愿将count用作变量名:立即可以理解。for (int count = 0; count < 10; count++)while (count--)
托德·雷曼

4

阅读Kilian的答案中的代码,我不认为“存在一个循环,并且存在一个变量,它的类型为int,它的名称为,名称为i,并且初始化为0 ,。” ..”。我只是认为“循环...”中的三个点代表了我什至没有想到的不重要的细节。在我的程序员看来,该变量实际上并不存在,这只是我必须键入的伪像,例如for(;;){}使其成为循环。

由于该变量在我的脑海中甚至不存在,为什么我要给它起一个绝对必要的名称呢?


我应该补充一点,在这种结构中,我经常不愿意甚至使用i,而是_使用显然毫无意义的变量。但是并不是每个人都熟悉Prolog,它可能会吸引更多的关注,而不是消除它。
Kilian Foth,2015年

您还需要考虑如何在循环而不是仅在for (...)标头中使用变量。

@KilianFoth:我相信,在Haskell,ML,F#和Scala中也使用了这种方式。并且在Ruby中,尽管它_是一个合法的标识符,但与Ruby 一样,最近发生的变化是,即使Ruby通常会警告未使用的局部变量_(或以开头_)也不会生成“未使用的局部变量”警告。
约尔格W¯¯米塔格

-1

如果您将字母i,j,k称为循环中的索引,则这是Java和其他编程语言中的常见做法。虽然在那里最好为每个样式循环使用a,例如

for(User user: users) {
  doSomethingWithTheUser(user);
}

代替

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

在Java中,这种循环样式只是最近才引入的。这可能就是为什么您对Java更为注意的原因,因为循环索引曾经是循环数组或列表的最常见方法。

在其他一些情况下,可能适合使用单个字母,例如在实现数学功能时,可能已经很常见了单个字母(例如n,x或y)。但总的来说,不,将变量命名有意义。


5
“在Java中,循环样式只是在最近才引入的”……就像十年前一样?(Java 5于2004年发布
优点

1
是的,那是最近的事。不,我不老。闭嘴。该死的孩子们离开我的草坪。Java 5之前的版本中仍然有许多遗留Java应用程序。还有更多的Java程序员,他们在Java 1.4上学习了该语言,但拒绝更新其工作方式。但是还有更多的在线代码示例可以追溯到2000年代初期(是的,那时我们确实有Internet;我们只是将其称为Web 2.0)。
尼克(Nick)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.