仅为了可读性而引入变量?

时间:2015-01-22 14:54:17

标签: java readability

仅为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());
}

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

我在代码中没有看到这个,我想知道这是否有用?

谢谢

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

4 个答案:

答案 0 :(得分:7)

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

我会在这里介绍两种新方法而不是变量,代码示例如下:

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

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

答案 1 :(得分:3)

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

重要的一点是要记住保持局部变量的范围尽可能小。因此,如果它们仅在if块中进一步使用,则不要在方法的开头声明局部变量。

修改:还有一件事我刚注意到:你的两个例子是 NOT 等效。在第一个场景中,表达式在每次迭代时重新计算,而在第二个场景中则不重新计算。在这种情况下,您需要一个辅助方法,如@NESPowerGlove所述,而不是变量。

答案 2 :(得分:1)

是的,在程序中根据程序中的工作或功能来命名变量是一个很好的做法。因为将来如果其他人在你的代码上工作,那么他会更容易理解,否则会给他一个在分布式程序上工作时也会出现同样的问题,你的同事必须理解变量的名称。

答案 3 :(得分:1)

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

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");
}