让我们说:
if(condition) {
i = 1;
} else {
i = 2;
}
您需要发表解释if
和else
块的评论。什么是最易读的方式,以便有人可以在第一眼就轻松拿起它们?
我通常这样做:
//check for condition
if(condition) {
i = 1;
} else {
//condition isn't met
i = 2;
}
由于评论位于不同的级别,我觉得不够好,所以快速浏览一下,您只需选择if
评论,else
评论看起来就属于某种内部结构。< / p>
把它们放在这样:
if(condition) {
//check for condition
i = 1;
} else {
//condition isn't met
i = 2;
}
对我来说也不好看,因为看起来整个结构没有被评论(条件可能很大并且需要多行)。
类似的东西:
//check for condition
if(condition) {
i = 1;
//condition isn't met
} else {
i = 2;
}
从评论的角度来看,可能是最好的风格,但作为代码结构令人困惑。
你如何评论这些块?
PS。我不是要求重构这两行代码,只考虑代码样式和注释格式。
答案 0 :(得分:30)
如果需要评论if else语句,我更喜欢描述使代码达到这一点的情况。 特别是在具有高圈复杂度的代码中
if (condition) {
// User is taking a course at college x:
i = 1;
} else {
// User is not taking any course at college x:
i = 2;
}
答案 1 :(得分:22)
另一种选择是:
if(condition) { //check for condition
i = 1;
} else { //condition isn't met
i = 2;
}
答案 2 :(得分:13)
您应该只注释代码是否不自我解释。所以,如果自我解释。像这样或许
bool fooIsNotReallyGood = ....;
if(fooIsNotReallyGood) {
...
} else {
...
}
答案 3 :(得分:10)
如果代码还没有自我记录,那么我会按如下方式构建它:
if (someCondition) {
// If some condition, then do stuff 1.
doStuff1();
}
else {
// Else do stuff 2.
doStuff2();
}
但同样,如果代码已经自我记录,则没有多大意义。如果你想添加评论,因为有一些复杂的条件,如:
if (x == null || x.startsWith("foo") || x.endsWith("bar") || x.equals("baz")) {
doStuff1();
}
else {
doStuff2();
}
然后我会考虑将其重构为:
boolean someCondition = (x == null || x.startsWith("foo") || x.endsWith("baz") || x.equals("waa");
if (someCondition) {
doStuff1();
} else {
doStuff2();
}
其中,变量名someCondition
实际上总结了整个条件。例如。 usernameIsValid
,userIsAllowedToLogin
左右。
答案 4 :(得分:5)
转到自我评论条件,然后不需要其他评论。假设条件是达到最大贷款价值。这给了我们:
if (maximumLoanToValueIsReached)
{
i=1;
}
else
{
i=2;
}
当i = 2时,无需指定尚未达到最大贷款价值,因为这是自我解释。另外,我还要将i
重命名为更有意义的内容。
答案 5 :(得分:4)
我根本不会对这些特定情况发表评论 - 评论不会对您已经清晰的代码增加任何价值。如果你有一个非常复杂的条件难以阅读,我会考虑将它分解为一个函数(可能是inline
),并且它的名称非常干净。
答案 6 :(得分:2)
//condition isn't met
似乎是一个无用的评论。但是在需要这样的评论的情况下,我这样做(C#):
//check for condition
if(condition)
{
i = 1;
}
//some other condition
else
{
i = 2;
}
但是,如果块只是if-else,那么我会在之前合并两个注释。
对于javascript,我更喜欢
//check for condition
if(condition) {
i = 1;
} else { //some other condition
i = 2;
}
P.S。似乎人们有很多意见:)
答案 7 :(得分:2)
这是我对if语句的评论,尽管我通常发现它不是必需的。我喜欢将它与if / else一致,并标记为相同的位置
if ( condition ) //if above the bar
{
i = 0;
k = 1;
}
else //else if below
{
i = 1;
k = 2;
}
答案 8 :(得分:1)
变量很重要,而不是条件本身。
if condition: # <condition dependent variable> was <predicated>
dosomething()
elif othercondition: # <othercondition dependent variable> <predicated>
dootherthing()
else: # <all variables> <not predicated>
doelsething()
答案 9 :(得分:1)
没有单一的答案 - 不同的人会对最的可读性有不同的看法。但是,我认为有一致意见认为评论实际上应该为(否则是不言自明的)代码增加价值,并且评论风格应该是一致的。
我处理评论的方式不是立即自我解释的条件是这样的:
// If the condition for a local tree imbalance is met,
// juggle the immediate nodes to re-establish the balance.
// Otherwise, execute a global balancing pass.
if ( somewhat muddled condition )
{
...code...
}
else // Tree is in local balance
{
... more code...
} // if/else (tree locally imbalanced)
对最终'}'的评论主要是为了让条件的结束更具视觉权重,使阅读源更容易。
答案 10 :(得分:1)
评论非常个人化,而且(正如前面的一些答案所示)会产生与代码一样多的争论。
在简单的情况下,评论会减损代码。但假设情况更复杂,我更喜欢:
/*
** Comment explaining what the condition
** is trying to determine
*/
if ( condition )
{
/*
** Comment explaining the implications
** of the condition being met
*/
do_something();
}
else
{
/*
** Comment explaining the implications
** of the condition not being met
*/
do_something_else();
}
无论如何,评论不能只重复代码。
答案 11 :(得分:-3)
您可以将if-else
代码提取到方法并正确命名:
function main() {
checkForCondition(condition);
conditionIsNotMet(condition);
}
function checkForCondition(boolean condition) {
if (condition) {
i = 1;
}
}
function conditionIsNotMet(boolean condition) {
if (!condition) {
i = 2;
}
}
在这种微不足道的情况下,这似乎有点矫枉过正,但想象每个if-else
分支有多行。