编码风格主要是为了可读性还是还有其他因素?

时间:2009-08-08 10:58:58

标签: coding-style

我记得在Douglas Crockford的“Javascript the Good Parts”一书中读到,由于自动分号插入,无块语句可能会出错。

if (condition)
   foo = true;

VS

if (condition) 
{
   foo = true;
}

在第二个示例中,它将一致地工作,在第一个示例中,解释器将自动插入分号,并且可能导致代码中的歧义。道格拉斯指出,这可能很糟糕,很难调试,我同意这一点。但它让我想到有哪些例子编码“风格”实际上有语法含义?换句话说,未遵循某种缩进或明显样式的示例实际上会导致错误或错误。我认为Python具有重要的空白是一个例子,YML要求没有标签是另一个。

随意回复各种语言和习语。我很想知道范式案例。在你的回答中,我想知道编码风格或语法行为的内容和原因。我不想开始任何编码风格的火焰战争,只是事实情况下,不知情的人会被绊倒。

10 个答案:

答案 0 :(得分:7)

Javascript单独处理这两种情况。你必须使用第一个

return {
   // code
}

return 
{
   // code
}

如果你不这样,口译员会在错误的地方添加半冒号。我认为它会在条件之后提出一个。所以第二个会错误地读作。

return;
{
   // code
}

这不是无效的语法。

答案 1 :(得分:4)

编码风格不仅仅是为了便于阅读。还有一些其他因素,如

  • 避免常见的语言陷阱(沉默失败,投票时例外等)。
  • 易于维护
  • 提高代码的清晰度(例如私有函数总是启动loweCase和公共蜜蜂PascalCase)
  • 执行约定(例如,不使用多重继承或始终在c ++中继承public)

易维生素的一个例子如下:

if(x) return true;

VS

if(x) 
{
   return true;
}

很明显,第二个更容易维护,因为我可以简单地继续添加一个新行并添加对bla()的调用,而无需在之前添加括号。

答案 2 :(得分:4)

之前没有人提到过,但有一点是写作

if(NULL == p)// ...

而不是

if(p == NULL)// ...

这两者在功能上是等价的,所以这是一种风格问题。许多人更喜欢顶部的样式,因为如果你错误地输入“=”而不是“==”,第一个将不会编译,而第二个将编译,并创建一个很难找到的错误(尽管一些编译器现在给出你警告if(p = NULL))。

答案 3 :(得分:2)

在Python中,空格缩进而不是花括号或关键字分隔语句块。在某些陈述之后,缩进的增加;缩进的减少表示当前块的结束。

答案 4 :(得分:2)

除了分隔某些语言标记外,空格在任何C语言系列中都不重要。源代码的布局对编译器生成的可执行文件没有影响。

答案 5 :(得分:2)

在C ++中,

之间存在差异
vector<pair<int,int>>

vector<pair<int,int> >

因为&gt;&gt;解析器将其视为单个标记。

答案 6 :(得分:2)

每当我打开括号,括号,单引号或双引号时,我总是关闭它,然后回去写下声明,条件等......这样可以避免一些可能出现的大错误!

答案 7 :(得分:1)

这取决于语言。在大家庭C / C ++ / Java / C#中,只要你的大括号被正确打开和关闭,空格就不是限制。

在像VB这样使用配对关键字的语言中,只是因为关键字划分了你不能拥有的功能

Private Sub someFunction() End Sub

但是在C,C ++和其他卷曲语言中,你可以拥有

void someFunction() { }

在python中,我猜它是一个完全不同的问题。

这一切都取决于特定的语言。根据您的具体示例,我不认为两者之间存在语法或语义差异。

答案 8 :(得分:1)

它依赖于语言。 例如在Java

void someFunction() { }

void someFunction() { 
}

void someFunction() 
{ 
}

无任何暗示。但是,如果您感兴趣,Sun已经列出了一系列编码约定,您可以阅读它们here.

这些主要是为了代码的可维护性和可读性,但不必严格遵守。

答案 9 :(得分:1)

标题并非特定于条件块,因此我想到了这一点:

我还没有看到它被提及,但要考虑的一件事是你如何用简单的工具找到东西(比如grep及其来自windowsland的低级实现)。

例如,考虑这个(诚然有点人为)的例子

class Foo
// vs.
class
Foo

你可以用regex“class \ s + Foo”找到前者,但对于后者你必须有一个可以解析C ++ / C#/ java的专用工具。

这也适用于C函数原型,有些奇怪的人喜欢

void
bar (void)
// to 
void bar(void)

虽然你通常可以假设如果在函数名前面是一些A-Z字符,那么它很可能是定义/声明。

实际上,当遇到ifblocks时,放置大括号对Visual Studio 200x中的调试代码有很大的影响。当它进入函数/块时,它会将文本/执行行光标放在开括号上。因此,如果右侧的括号恰好是waaaaay,则代码窗口必须滚动并且buggeritall停留在那里。非常讨厌。