为了提高可读性而引入变量?

3

仅为了 ���读性 而引入变量,这是一个好主意吗?

示例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());
}

这可能是一个极端的例子,但我认为你已经理解了这个概念。

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

谢谢。

背景:我正在尝试从大学转变为初级开发人员,目前我正在专注于编写清晰的代码。


1
这个问题非常主观。 - Koray Tugay
1
是的,这是个好主意。你甚至可以将它放在一个方法中。不过可能最好找一个更短的名字,比如 nodesHaveSameInitial(node1, node2) - assylias
你可以添加注释。在代码中添加注释和使用良好的变量名称一样重要。 - DaaaahWhoosh
5
不!尝试避免注释,专注于更好的类、方法、参数和变量命名。文档总是在说谎,因为你的代码会不断演化,但文档却不会。 - Steffen
1
如果在循环内部不重新分配letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter,则示例2可能会导致无限循环。这是引入可读性变量会创建意外错误的示例。NESPowerGlove的答案展示了更好的方法。 - TheBlastOne
显示剩余2条评论
4个回答

7

始终保持代码的可读性是更好的选择,但不要过度使用,否则会导致维护成本增加。尽管大多数简洁的代码更易于维护。

我在这里引入两种新方法来替代变量,你的代码示例将会是:

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

将布尔条件提取到自己的函数中并命名是一种常见的可读性重构。如果一个人正在阅读你的代码,并遇到一些if语句和一堆条件,他们会想知道它的重要性,为什么需要该分支或者表示什么意义。仅凭字段可能无法回答他们的问题,但如果条件有一个名称(函数的名称),他们可能会知道它代表什么。


谢谢。非常感谢。 - SklogW
那么将其拆分为两个方法还会有更易读的堆栈跟踪的额外好处,我是正确的吗? - SklogW
@SklogW 没问题。如果你正在寻找更多关于清晰代码实践的信息,我推荐阅读《Clean Code》这本书。它基本上是这个主题的指南书,所有的例子都是用Java写的。 - NESPowerGlove
我认为这样做可能会有用,但我不会过于深入地决定可读代码的事情。经常有一句话流传开来,说代码被阅读的次数比被编写或修改的次数多10倍。干净的代码主要是为了让大部分时间在编码(阅读)上更加轻松。不过,关于堆栈跟踪的问题确实有道理,有时候人们在编写单元测试时会编写详细的名称和标识符,以便在堆栈跟踪/结果中看到失败的具体要求。 - NESPowerGlove

3
除了您的示例中变量名有点冗长之外,是的。
但是,重要的一点是要记住尽可能将局部变量的作用域保持小。因此,如果局部变量仅在稍后的if块中使用,则不要在方法开头声明局部变量。 编辑:我刚刚注意到另一件事情:您的两个示例不相等。在第一种情况下,在每次迭代中重新计算表达式,在第二种情况下则不是。在这种情况下,您需要一个帮助器方法,如@NESPowerGlove所解释的,而不是一个变量。

2
这个问题相当主观,但以下内容适用于所有学科。(我想在这个答案中加点乐趣)
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");
}

1
当然,根据程序中变量的工作或功能进行命名是一种良好的实践。因为如果将来有人处理您的代码,则更容易理解,否则会让他感到头疼。在处理分布式程序时,同事们必须通过名称了解变量的作用。

这是我们每次对将来使用我们代码的人说的话,但大多数时候,当我遇到别人的代码时,我注意到他们没有为我(特别是我)考虑到同样的事情... :p - nobalG
这就是为什么我们不应该这样做的原因 @nobalG - kirti

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