【问题标题】:Introducing variables only for readability?仅仅为了可读性而引入变量?
【发布时间】:2015-01-22 14:54:16
【问题描述】:

仅仅为了readability而引入变量是个好主意吗?

示例 1:

while(nameNode1.charAt(0) == nameNode2.charAt(0) && nameNode1.length() > 1 && nameNode2.length() > 1)
{
    nameNode1 = nameNode1.substring(1, nameNode1.length());
    nameNode2 = nameNode2.substring(1, nameNode2.length());
}

示例 2:

boolean letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter = nameNode1.charAt(0) == nameNode2.charAt(0) && nameNode1.length() > 1 && nameNode2.length() > 1;

while(letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter)
{
    nameNode1 = nameNode1.substring(1, nameNode1.length());
    nameNode2 = nameNode2.substring(1, nameNode2.length());
}

这可能是一个极端的例子,但我想你明白了。

我没有在代码中看到这个,我想知道这是否是一种有用的方法?

谢谢

背景:我正在尝试从大学过渡到入门级开发人员,目前我专注于简洁编码。

【问题讨论】:

  • 这个问题真的很主观。
  • 是的,这是个好主意。你甚至可以把它放在一个方法中。不过,找到一个较短的名称可能是有意义的,也许是nodesHaveSameInitial(node1, node2)?
  • 您可以添加评论。注释您的代码与拥有良好的变量名同样重要。
  • 不!尽量避免使用 cmets 并专注于更好地命名类、方法、参数和变量。文档总是在撒谎,因为您的代码包含而不是您的文档
  • 如果您不在循环内重新分配 letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter,示例 2 可能会导致无限循环。这是一个示例,说明如何引入变量以提高可读性会产生意想不到的错误。 NESPowerGlove 的回答显示了一种更好的方法。

标签: java readability


【解决方案1】:

让代码可读总是更好的,只是不要做太多维护噩梦,尽管大多数干净的代码更容易维护。

我将在这里介绍两个新方法而不是变量,您的代码示例将是:

while(letterFromBothNodesAreEqual() && nameHasMoreThanOneLetter())
{
    nameNode1 = nameNode1.substring(1, nameNode1.length());
    nameNode2 = nameNode2.substring(1, nameNode2.length());
}

将布尔条件提取到具有名称的自己的函数中是一种常见的可读性重构。如果一个人正在阅读您的代码并遇到一些带有一堆条件的 if,他们会想知道它的意义是什么,为什么需要分支或它代表什么。单独的字段可能不会告诉他们答案,但如果条件有名称(函数的名称),他们可能知道它代表什么。

【讨论】:

  • 谢谢。欣赏它
  • 因此,将其拆分为两种方法还会带来额外的好处,即堆栈跟踪的可读性更高,对吗?
  • @SklogW 没问题。如果您正在寻找有关清洁代码实践的更多信息,我会推荐这本书清洁代码。它基本上是关于这个主题的书,示例都是用 Java 编写的。
  • @SklogW 我想它会,但我不会那么深入地做出关于可读代码的决定。经常有一句名言说代码的阅读频率比编写或修改的频率高 10 倍。干净的代码主要是为了让大部分时间花在编码(阅读)上更容易。尽管关于堆栈跟踪,这是一个公平的观点,有时当人们编写单元测试时,他们会编写详细的名称和标识符,以便他们可以在堆栈跟踪/结果中看到测试失败时失败的实际需求。
【解决方案2】:

除了您示例中的变量名称有点过于冗长之外,是的。

但有一点很重要,那就是要记住使局部变量的范围尽可能小。因此,如果局部变量仅用于更下方的if 块,请不要在方法的开头声明它们。

编辑:还有一件事我刚刚注意到:您的两个示例等效。在第一种情况下,每次迭代都会重新计算表达式,而在第二种情况下则不会。在这种情况下,您需要@NESPowerGlove 解释的辅助方法而不是变量。

【讨论】:

    【解决方案3】:

    这个问题非常主观,但以下内容适用于所有科目。 (我想对这个答案有一点乐趣)

    private boolean isMoreReadable = true;
    private boolean isEasyToMaintain = true;
    private boolean isProperlyCommented = true;
    private boolean isBugFree = true;
    
    // This method checks if my co-workers are happy with my code
    private boolean myCoWorkersHappyWithMyCode() {
        return isMoreReadable && isEasyToMaintain && isProperlyCommented && isBugFree;
    }
    
    if (myCoWorkersHappyWithMyCode()) {
        System.out.println("YES, you wrote good code so I don't see why not");
    } else {
        System.out.println("NO, keep learning to better yourself");
    }
    

    【讨论】:

      【解决方案4】:

      是的,当然,根据程序中的工作或功能来命名变量是一个好习惯。因为如果将来其他人在你的代码上工作,那么他会更容易理解,否则会给他一个在处理分布式程序时同样会发生头痛,您的同事必须了解变量名称。

      【讨论】:

      • 这是我们每次都说的,对于将来会使用我们代码的人来说,但是大多数时候当我遇到某人的代码时,我注意到他们并没有为我照顾同样的事情(特别是)..:p
      • 那是我们不应该这样做@nobalG
      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多