Java中编写“优美”代码的标准是什么?

8

我正在阅读一些关于Java代码规范的书籍。我一直喜欢美观和干净的代码。

但有些事情让我感到困惑。例如,方法名应该以小写单词开头,如果有第二个单词,则应以大写字符开头。但变量的标准也是相同的。我认为这有点混淆。

所以我问你们,在Java中,你们的编码规范是什么? 像:

  1. 你如何命名对象、方法、类等。
  2. 如果你有多个来自同一类的对象,你如何给第二个对象命名?
  3. 如果你在方法的参数中有一个对象,而且在这个方法中还有另一个来自同一类的对象,你如何给它们两个命名?
  4. 在性能/代码美观方面,很多小方法或一些较长的方法哪种更好?
  5. 欢迎发表更多意见。=)

2
始终钟爱整洁美观的代码 - 用Java来实现这一点似乎不可能...开玩笑 :) - Adam Gent
带着一定的保留态度看待所有建议使用Java代码规范的答案。使用默认规范编写漂亮的Java代码非常困难。我曾经见过非常漂亮的C代码,还截了屏并打印出来。但我几乎从未见过漂亮的Java代码:尝试实例化一个泛型集合,然后告诉我它是否可以看起来“好看”(Java太冗长了,你无法真正拥有好看的代码)。请注意,我确实建议遵循Java编码规范:但最终你会得到丑陋的代码。 - SyntaxT3rr0r
@SyntaxT3rr0r:考虑到C语言没有泛型,所以比较有些缺陷。如果我将C++模板与Java泛型进行比较...不,我真的看不出太大的区别。至少Java有一个官方编码规范...如果C也有一个规范,那就可以避免很多头疼了。 - Voo
@Voo:实际上可以更好地避免头痛的一件事是使用谷歌的“Go”语言:在那里缩进和括号位置由语言规范强制规定,并有一个自动进行格式化的工具(IDE也会强制缩进/括号位置)。不再有愚蠢的争论,例如“if后面的括号应该与同一行”或“缩进4个空格还是2个空格”等。 :) - SyntaxT3rr0r
6个回答

15
  1. 大多数情况下遵循Java代码规范
  2. 我尽量不让对象的类别成为问题。例如,如果我有五个不同的字符串,每个变量的名称应描述变量表示的信息/内容,而不是它是一个字符串。
  3. 我发现为了区分方法参数和类变量而试图想出变量的变体通常很愚蠢。我通常使用相同的名称和这个语法this.theVariable = theVariable
  4. 方法应尽可能短:尽可能少的行数和尽可能少的嵌套级别(即最多一个if语句,而不是ifs内部的ifs等)
  5. 强烈推荐Robert Martin的整洁代码

1
好吧,我不太确定 4 是否适用于一般规则。显然,一个大而难以阅读的代码块是不好的,但我曾经看到相反的情况,那时候代码非常难以阅读。我尝试将代码划分为在语义上有意义的部分。 - Voo
@Voo:自然而然,没有必要过度做任何事情。没有必要将您的代码分解为每个函数仅包含一行。但是,如果您最终拥有跨越多行的函数(我猜对于什么被认为是“几个”没有好的答案 - 它可能是5、10或20甚至更多,完全取决于情况),那么您很有可能可以进行一些有意义的重构 - 要么将其拆分为更多函数,要么甚至将其拆分为几个类。 - Julian
1
截至2020年8月,这是链接:https://www.oracle.com/technetwork/java/codeconventions-150003.pdf - KrishPrabakar

6

仅针对一个具体问题进行说明,因为我常常看到人们在这个问题上做出可怕的事情:

如果你有多个同类对象,第二个应该如何命名?

按照他们的目的来命名。如果你有两个不同用途的同类对象,那么你必须为它们分别命名,根据它们的用途。我认为这些例子对大多数读者来说都是很容易理解的:

public void copyAddresses(Customer source, Customer destination) {


public void sendMessage(Mailbox sender, Mailbox recipient) {


public void changeContactCompany(User contact, Company from, Company to) {


public void eatWatermelon(Bowl servingBowl, Bowl bowlForSeedSpitting) {

或者说……你明白我的意思。


3
你应该从官方Java代码规范开始。
它们会解释为什么需要代码规范,不同的规范以及你问题似乎是关于命名规范。它们还提供了各种示例。

1
如果你使用像eclipse这样的好用的IDE,它会非常有帮助。它会按照应该出现的顺序组织导入,根据限制行缩进代码,警告你一些不良实践等等。 - bluefoot

3
什么是性能/代码美学的最佳平衡点:许多小方法还是一些更长的方法?
“过早优化是万恶之源”——Donald Knuth
记住:
1. 让它工作。 2. 把它做对。 3. 让它快速。
只有当需要时,您才应该担心性能;如果当前代码太慢无法满足要求。在这种情况下,您应该找到“热点”并对其进行优化。检查性能是否足够好。如果不好,重复上述步骤。

+1 这是一个非常值得记住的观点。 - Julian
2
那是 Knuth 实际引用语的一个非常简短、不完整的片段(并且被广泛误解)。 - Robert Harvey
@Robert_Harvey:能详细解释一下吗?我总是听到这个上下文,如果我错了,我想确保不会再传播。谢谢。 - c_maker
@c_maker:这篇博客文章或许能为你提供更多关于Knuth的引用(或者说是这个“部分”引用)的背景信息:http://reedcopsey.com/2011/09/09/performance-and-optimization-isnt-evil/。 - Julian

2

由于大多数内容都可以通过谷歌轻松搜索,我将添加自己的标准Java命名惯例:

通常我会在类名后缀中加上它们扩展或实现的内容。换句话说,Spring MVC控制器的后缀为“Controller”。这使得在Eclipse中很容易执行Crtl-Shift-R *Controller。

其次,如果我发现需要聚合一整堆静态方法到一个类中,我通常会在该类的后缀中加上“Utils”。我从Apache Commons中学到了这个习惯,已经成为了我的一种惯例。

最后,对于执行特殊昂贵操作且是瞬时的派生方法,我避免将它们命名为getXXX。原因是要避免与序列化程序出现问题。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接