}后代码块末尾的“ //…”注释-好还是坏?[关闭]


18

我经常看到这样的评论:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

有时甚至

if (condition) {
   ...
} // if (condition)

我从不了解这种做法,因此也从未应用过。如果您的代码很长,以至于您需要知道结尾}是什么,那么也许您应该考虑将其拆分为单独的函数。而且,大多数开发人员工具都可以跳转到相应的括号。最后,对我来说,最后一个明显违反了DRY原则;如果您更改条件,则必须记住也要更改注释(否则可能会使维护者甚至您变得混乱)。

那么人们为什么要使用它呢?我们应该使用它,还是不好的做法?


在PHP中,我将替代语法用于控制结构if(condition): ... else: ... endif;
systemovich 2011年

@Geoffrey van Wyk-真的吗?我从未见过有人在模板文件之外使用这些文件。它们非常不合标准,但我想每个人都有。
搜寻

4
@Craige:PHP原生支持的任何语言构造都不是“ Extremely Unstandard”的-PHP解释器定义了什么是“ standard”。
Billy ONeal

Ada对于大多数结构的结尾都有特定的标记:if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;。我发现它有助于提高可读性(并且由编译器检查,而注释没有)。
基思·汤普森

Answers:


32

我要说的是,如果您的代码太长,以致于您无法轻松地遵循括号,那么对于大多数语言而言,您的代码就需要重构。

但是,在模板语言(如PHP)中,它可能是有效的,因为您可能有大量的HTML块将条件或循环结构的开始和结束分开。


5
如果您将PHP与HTML混合使用,则对PHP完全有效。格兰芬多1分。

3
即使将PHP作为与HTML混合使用的模板语言,您仍然可以缩进。您可以使用PHP作为模板语言时,也不宜使用大括号,而是while(): endwhile;foreach(): endforeach;结构等
Htbaa

9
我真的不明白为什么您不应该重构PHP。可能是另一种语言。
汤姆·哈特芬

@Htbaa:我不敢相信我一直都在使用PHP,并且对此一无所知。谢谢!关于缩进,我更喜欢将条件HTML缩进与页面的其余部分保持一致,而不是与创建它的PHP保持一致。
Matt Ellen

3
@汤姆:我笑了,但感到内。:P

17

这是一种代码气味,通常是老式代码风格的宿醉。之前,体面的IDE重构变得更加困难且不像现在那样普遍,因此方法更长了,这些注释可以帮助他们更好地导航。


15

这是一种由于许多因素而过时的可怕做法。

  • 当插入符号在任一符号上时,大多数现代IDE都会突出显示相应的括号。
  • 如果您编写的代码整洁,则很少会找到方法超过10行的地方。

我注意到许多Java程序员都具有这种思维方式,这使Java代码看起来确实很脏,并且将注意力从代码转移到了注释上。

强烈建议不要使用此功能。


4
我有一个同事(java开发人员)来做这个。除了不是// for和//如果他使用// rof和// fi。这让我发疯,他无所不在​​。
杰伊(Jay)

是的,我坚持了这一点。AAAAAGHHHHH。
钻机2012年

2
实际上,这与Java或Java程序员没有任何关系,并且在用Java进行编程时,这并不常见,也不是事实上的标准。
Jesper 2012年

1
+1,000表示“这是一种可怕的做法”。
scunliffe 2012年

6

读取的代码比编写的代码多10倍。

如果它更易于阅读,请执行此操作。

我也建议任何这样做的人,他们应该考虑其他一些使事情更容易阅读的方法。别人提到的重构技术,不同行上的括号等都很好。将事物拆分为不同的函数,方法或类,以便代码可以自我注释也很好。还有一些方法可以消除大多数“ if”并将“ for”循环放入明显的​​位置,从而消除了对任何这种情况的需要。

但是,有时人们正在学习。如果这是他们正在做的事情,那实际上是在使代码更具可读性,鼓励它,然后再鼓励其他一些实践。学习的人们应该得到鼓励,无论他们如何开始,都将从中受益。说“这不好”不如说“这更好”。


6
不好的。即使是初学者级的教科书也不能做到这一点。“读取的代码比编写的代码多10倍”……更多的原因是,不要因为代码混乱而浪费读者的时间。
Thomas Eding

@trinithis如果您有20个case的switch语句怎么办?有时您需要支持20种不同的选择,将它们聚集在一个地方比将其“重构”为某种多级决策方案更好。
quant_dev

我认为这是编码人员的一种做法,他们低估了同行:)除非其他人不够聪明,否则他们无法阅读代码。一般而言,我反对这种做法,但是如果有人这样做,那就好了,因为}杂乱无章,难以理解。我还是不这样做!
WinW 2012年

1
@trinithis并不是关于它是否有害,它是关于帮助人们变得更好,从而使他们成长的有效方法。有效>正确。例如,如果您重构的旧代码更加混乱,那也是一件非常明智的事情。有时坏事可以采取更好的过渡步骤,甚至带来更好的结果。
Lunivore'4

1
@trinithis对不起,当它们全部放在一行时,我无法理解您的意思。我想我提到过,还有其他方法可以帮助开发人员学习重构代码。
Lunivore'4

4

我有一个很大的(C ++)代码库,里面充满了这种东西:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

对于这么小的东西,我会说这超出了“代码气味”到“代码臭味”的范围。尤其是在IDE中,我可以通过按键将右括号与右括号匹配以找到右括号。给定更长的方法,我仍然会在终端注释上进行括号匹配。这样的评论分散了我的注意力,我倾向于将它们视为噪音。


嗯,我想我在这个网站上没有得到一些格式。每个括号都应该单独放置,方法主体也应该单独放置。
PSU

尽管在C ++中,我经常会在顶部打开匿名名称空间以获取隐藏的实现内容。然后在某个时候我关闭了该花括号,知道此处的花括号很有用。
CashCow 2011年

4

在C ++中,有两个保持有效的保持状态,不需要“拆分代码”的建议保持有效:

  1. 对于名称空间。名称空间可以包含整个文件,并且最后一个括号有时可能会使人丢掉,因此添加注释以指示括号是名称空间的关闭很有用。对于我公司的特定编码风格而言,这很重要,因为我们不缩进名称空间,因为我们决定缩进只会浪费文件中的空间。

  2. 适用于#ifdef / #endif对。有时,其中有很多代码用于条件编译,嵌套时可能会令人讨厌,并且我们经常使用的编辑器“费力地”消除了缩进,因此注释在快速概述中很有用。


+1表示名称空间的注释及其原因。这是我唯一一次这样做,并且出于同样的原因
JohnB 2012年

+长开关语句。
quant_dev

1

对我来说,代码必须令人困惑,难以添加您指定的注释。

如果只是说// IF语句。然后您想知道为什么它首先存在。


我同意,它看起来像是已被注释掉的一行,而不是一所古老的学校//endif
StuperUser 2011年

1

看到大括号正在关闭的另一种方法是在与关闭列相同的列上放置一个打开。我发现它更清晰,更易读。

当由于打开很久以前而通常难以跟踪时,该注释很有用。通常只对名称空间(特别是C ++中的匿名名称空间,用于编译单元中的实现细节)才发生这种情况。在大多数其他情况下,很明显您要关闭的内容。


1

这很大程度上是对80x24字符终端窗口中过去工作的保留,特别是如果您使用的是EVE之类的窗口式编辑器。即使现在,我还是在使用vim的终端会话中完成大部分工作,并且可以将会话拆分为三个或四个子窗口,因此我实际上只能在任何时间查看几行。

话虽如此,但我从来没有真正热衷于这项公约,即使它可以不止一次地挽救我的培根。我只是将其视为噪音。是的,如果循环或条件变得如此庞大,那么您可能要考虑重构。


0

您基本上会给出所有不使用此功能的正当理由。每个体面的程序员都应该应用这些。那么,为什么的人使用它?因为他们做错了,而且并不了解。


嗯,请解释一下赞成票。我不仅创造了这个答案,还源于现实生活中的经验:我的同事坐在我旁边几英尺处,已经进行了10多次这样的编程,直到我向他解释之前都不知道为什么这是错误的线索。
stijn 2011年

可能它在某些教科书中使用过,所以一堆人从大学出来使用它吗?它可以在介绍性文字中占有一席之地。在预处理器中也合理有效,尤其是在#ifdef / endif中包括警卫
Martin Beckett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.