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

Coding style 编码风格主要是为了可读性还是其他因素?,coding-style,Coding Style,我记得在Douglas Crockford的《Javascript好的部分》一书中读到,由于自动插入分号,无块语句可能会出错 if (condition) foo = true; vs 在第二个示例中,它将始终如一地工作,在第一个示例中,解释器将自动插入分号,并可能导致代码中的歧义。正如Douglas指出的,这可能是不好的,并且很难调试,我同意这一点。但它让我思考,是否有一些例子表明编码“风格”实际上具有语法含义?换言之,未能遵循某个缩进或明显样式的示例实际上会导致错误或错误。我假设Py

我记得在Douglas Crockford的《Javascript好的部分》一书中读到,由于自动插入分号,无块语句可能会出错

if (condition)
   foo = true;
vs

在第二个示例中,它将始终如一地工作,在第一个示例中,解释器将自动插入分号,并可能导致代码中的歧义。正如Douglas指出的,这可能是不好的,并且很难调试,我同意这一点。但它让我思考,是否有一些例子表明编码“风格”实际上具有语法含义?换言之,未能遵循某个缩进或明显样式的示例实际上会导致错误或错误。我假设Python具有显著的空白是一个例子,YML不需要制表符是另一个例子


您可以自由地用各种语言和习惯用语作出回应。我很想听听范例案例。在您的回答中,我想知道编码风格或语法行为的内容和原因。我不想开始任何编码风格的flame wars,事实上,在这种情况下,新手会被绊倒。

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

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

return {
   // code
}

return 
{
   // code
}
如果您没有,解释器会在错误的位置添加分号。我想这会让你的病情恶化。因此,第二个将被错误地解读为

return;
{
   // code
}

这不是无效语法。

空格在任何C语言家族中都不重要,只是用来分隔某些语言标记。源代码的布局对编译器生成的可执行文件没有影响。

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

在像VB这样使用成对关键字的语言中,仅仅因为关键字定义了您无法拥有的函数

Private Sub someFunction() End Sub
<>但是在C、C++和其他卷曲语言中,你可以有< /P>
void someFunction() { }
在python中,我想这是一个完全不同的问题


这完全取决于特定的语言。根据你的具体例子,我不认为这两者之间存在句法或语义上的差异。C++中的

< P>,

之间有区别。
vector<pair<int,int>>
向量

向量

因为解析器将>>视为单个标记。

编码样式不仅仅是为了可读性。还有其他一些因素,比如

  • 避免常见语言陷阱(无声失败、施放时出现异常等)
  • 易于维护
  • 提高代码的清晰度(例如,私有函数总是从loweCase和public beeing PascalCase开始)
  • 强制执行约定(例如,在c++中不使用多重继承或始终继承公共)
以下是易于维护的示例:

vs

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

这取决于语言。 例如在Java中

void someFunction() { }

不会有任何暗示。然而,Sun已经列出了一系列编码约定,如果您感兴趣,可以阅读它们


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

以前没有人提到过,但风格的一点是编写

如果(NULL==p)/

而不是

如果(p==NULL)/


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

每次我打开括号时,用大括号,单引号或双引号我总是关闭它,然后回去写声明,条件等。。。这使我避免了一些可能的大错误

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

<>我没有看到它提到过,但有一件事要考虑的是,如何用简单的工具(如GRIP及其低级实现从WielsSand)找到事物。

例如,考虑这个(当然有点做作)例子< /P> 您可以使用regex“class\s+Foo”找到前者,但对于后者,您必须有一个能够解析C++/C#/java的专用工具

这也适用于C语言中的函数原型,有些古怪的人更喜欢它

void
bar (void)
// to 
void bar(void)
虽然您通常可以假设,如果函数名前面有一些A-Z字符,那么很可能是定义/声明


实际上,对于ifblocks,在VisualStudio200x中放置大括号对调试代码有很大的影响。当它进入函数/块时,它会将文本/执行行光标放在左括号上。因此,如果括号正好在右边,代码窗口必须滚动到那里,buggeritall保持在那里。非常烦人。

啊,就是这样!现在我记得在道格拉斯·克罗克福德的《Javascript好零件》一书中读到了这一点。自动分号的问题。Javascript的“邪恶”特性之一。谢谢读到这个答案我很惊讶,因为我自己从来没有遇到过这个问题。我对关于Crockford这本书的评论更为惊讶,因为我刚刚读了这本书,记不起这些宝贵的信息。通过快速浏览这本书找不到它,所以我修改了一些代码以供自己查看,而您描述的行为没有发生。我读对了吗?你是说第二种方法会导致括号内的代码总是被执行吗?你不是孔子
if(x) return true;
if(x) 
{
   return true;
}
void someFunction() { }
void someFunction() { 
}
void someFunction() 
{ 
}
class Foo
// vs.
class
Foo
void
bar (void)
// to 
void bar(void)