【问题标题】:Standard for programming 'beautiful' code in Java? [closed]用 Java 编写“漂亮”代码的标准? [关闭]
【发布时间】:2011-03-06 13:31:52
【问题描述】:

我正在阅读一些关于 Java 编码标准的书籍。 我一直喜欢漂亮干净的代码。

但是有些事情让我很困扰。例如,方法名称应以小写单词开头,如果有第二个单词,则应以大写字符开头。但是变量的标准是一样的。我认为这有点令人困惑。

所以我问你们,你们的 Java 编码标准是什么? 喜欢:

  1. 你如何命名对象、方法、类、
  2. 如果您有多个来自同一类的对象,您如何命名第二个?
  3. 如果方法的参数中有一个对象,而该方法中有来自同一类的另一个对象,如何命名它们?
  4. 性能/代码美观、大量小方法或一些较长方法的最佳权衡是什么?
  5. 请随意多说。 =)

【问题讨论】:

  • 一直喜欢漂亮的干净代码 - 用 Ja​​va 那是不可能的......开玩笑:)
  • 对所有建议 Java 代码约定的答案持保留态度。使用默认约定很难获得漂亮的 Java 代码非常。我看到 C 代码非常好,我截取了屏幕截图并打印出来。我几乎从未见过看起来不错的 Java 代码:尝试实例化一个通用集合并告诉我它是否看起来“不错”(Java 是如此冗长,以至于您无法真正拥有漂亮的代码)。请注意,我确实建议遵循 Java 编码约定:但您最终会得到难看的代码。
  • @SyntaxT3rr0r:考虑到 C 没有泛型,比较有点缺陷。如果我将 C++ 模板与 Java 泛型进行比较……不,真的看不出有太大的区别。至少 Java 确实有一个官方的编码约定。如果 C 有一个可以省去很多麻烦的约定。
  • @Voo:实际上更让人头疼的一件事是 Google 的“Go”语言:缩进和括号位置是由语言规范强制执行的,并且有一个工具会自动进行格式化(IDE 会也强制缩进/括号位置)。没有更多愚蠢的火焰战“括号与 if” 或“4 个空格或 2 个空格缩进”等 :)

标签: java coding-style


【解决方案1】:
  1. 主要关注Java code convention
  2. 我尽量不让对象属于何种类变得重要。例如,如果我有五个不同的字符串,每个变量的名称应该描述变量代表的信息/内容,而不是字符串。
  3. 我发现仅仅因为变量既作为方法参数又作为类变量存在而尝试提出变量的变体通常很愚蠢。我大多使用与此语法相同的名称this.theVariable = theVariable
  4. 方法应该尽可能短:尽可能少的行,尽可能少的嵌套层(即最多一个 if 语句,而不是 if 中的 if 等)
  5. 强烈推荐Robert Martin's Clean Code

【讨论】:

  • 嗯,我不太确定 4 作为一般规则。显然,一大堆不可读的代码是不好的,但我看到了相反的情况,阅读代码非常困难。我尝试将代码拆分成语义上有意义的部分。
  • @Voo:当然,任何事情都不应该做得过火。没有必要分解您的代码,以便每个函数仅包含一行。尽管如此,如果您最终拥有跨越多行的函数(我想对于被视为“几个”的内容没有好的答案 - 它可能是 5、10 或 20 甚至更多,完全取决于情况),有很有可能你可以做一些有意义的重构——要么变成更多的函数,要么甚至把东西分成几个类。
  • 截至 2020 年 8 月,此链接为:oracle.com/technetwork/java/codeconventions-150003.pdf
【解决方案2】:

仅针对一个具体点,因为这是我经常看到人们做可怕事情的人:

如果你有多个来自同一类的对象,你如何命名第二个?

当然,按照他们的目的。如果您有同一个类的两个不同对象,则必须将它们用于不同的目的,因此以该目的命名。我认为所有这些示例对大多数读者来说都是不言自明的:

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 Code Conventions开始。

    他们将解释为什么需要代码约定、不同的约定以及您的问题似乎是关于naming conventions。他们还添加了各种示例。

    【讨论】:

    • 如果您使用的是不错的 IDE,例如 eclipse,它将对您有很大帮助。它将按照它们应该出现的顺序组织导入,根据限制线识别代码,警告您一些不良做法,等等。
    【解决方案4】:

    什么是最好的权衡 性能/代码美,很多 小方法,还是一些较长的方法?

    “过早的优化是万恶之源”——Donald Knuth

    记住:

    1. 让它工作
    2. 让它正确
    3. 让它快速

    只有在有保证的情况下,您才应该担心性能;如果当前代码太慢而无法满足要求。

    在这种情况下,您应该找到“热点”并对其进行优化。检查性能是否足够好。如果没有,请重复。

    【讨论】:

    • +1 记住这一点非常有效。
    • 这是一个非常简短、断章取义(并且被广泛误解)的高德纳实际报价的 sn-p。
    • @Robert_Harvey:你能详细说明一下吗?我总是在这种情况下听到它,我想确保如果它错了我不会进一步传播它。谢谢。
    • @c_maker:这篇博文可能会为您提供有关 Knuth 引用的更多背景信息(或引用的这部分,实际上是这样):reedcopsey.com/2011/09/09/…
    【解决方案5】:

    好吧,因为其中大部分都很容易用谷歌搜索,所以我将添加我自己的标准 Java 命名实践:

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

    其次,如果我发现我需要在一个类中聚合一大堆静态方法,我通常会在该类后面加上“Utils”。我从 Apache Commons 得到了这个,然后就卡住了。

    最后派生的方法可以做一些特别昂贵的事情并且是瞬态的,我避免称它们为 getXXX。原因是为了避免序列化程序出现问题。

    【讨论】:

      【解决方案6】:

      看这里official guide

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2012-07-31
        相关资源
        最近更新 更多