0%

有点学问在的缩进风格

什么是缩进风格

缩进风格是代码风格的一部分, 是自发形成的一种约定, 用控制代码块缩进的方式传达程序的结构。

缩进风格可以分为两个方面:缩进大小大括号位置

缩进大小

缩进在大部分语言中并不是强制要求, 但合理的缩进有利于人类理解程序的结构, 即提高了代码的清晰性。

1983年在PASCAL代码上进行的一项实验发现,缩进大小显着影响了可理解性。2 到 4 个字符之间的缩进大小被证明是最佳的。

在大部分的程序语言中, 默认使用四个空格或一个tab键(制表符可以与空格互相转换, 一个'等于4个空格)

在部分的脚本语言或HTML中, 可能会使用2个空格, 以避免过长的缩进。

下文中介绍的风格默认使用4字符缩进。

大括号位置

大括号用于声明程序的控制语句的作用域, 跟在(····)后面。

下面将介绍几种主流的大括号风格。

Allman风格

由一位大牛的名字命名, 又叫做BSD风格。

该风格的特点是大括号放到控制语句的下一行, 且与控制语句的缩进相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
while(cond)
{
if(cond)
{
//do something
}
else if(cond)
{
//do something
}
else
{
//do something
}
}
}

可以发现代码块中的代码与控制语句形成明显的区分, 左右大括号位于同一列, 一般而言对人来说更容易匹配到对应的带括号。

allman风格由于其清晰的代码结构, 常被用于教育。但它的缺点是,当代码块较短时(特别是只有一句), 过多的空行会导致程序很长, 容易让人产生阅读压力以及抓不住焦点。

K&R风格

不知道你是否听说过被誉为 “C语言圣经“的《C程序设计语言》(The C programming language), 这本书由两位大牛Kernighan & Ritchie (K&R)编写, 其中Ritchie正是C语言的创造者。

K&R风格便是在这本书中使用的缩进风格, 同时K&R风格及其变体也是目前使用最广泛的风格。

K&R风格的特点:

  • 函数的大括号位于单独一行
  • 控制语句的左大括号不换行, else或else if不换行
  • 只有一条语句的代码块不使用大括号, 而是换行后缩进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
while (cond) {
if (cond)
puts("K&R ");
else (cond)
puts("is best style!")

if (cond) {// )与{中间有空格, 这属于其他部分的代码风格
//do something
} else if (cond) {
//do something
} else {
//do something
}
}

}

差不多也能体会到, K&R风格总结起来就是:尽可能的压缩代码。 有人分析这是因为这些代码是要打印到书籍上的, 为了降低成本而尽可能的减少代码行数, 因此也有人称之为印刷风格。

K&R的缺点十分明显:左大括号不好找, 尤其在代码块较长时, 很容易找错左大括号。 就可读性而言确实是比不上Allman的, 但在现代IDE智能的高亮和匹配功能下, 也还行?

K&R变体 - 1TBS

”一个真正的大括号风格“(One True Brace Style), 是K&R的变体之一, 主要区别是:1TBS强制使用大括号, 也就是说即使只有一行也需要用大括号而不能省略。

1TBS存在的真实性存有疑问, 有些人认为它是如上所述的K&R变体, 有些人指出它不过是K&R的”行话“。

Whitesmiths风格

特点是大括号需要换行, 且需要缩进

1
2
3
4
5
6
7
8
if (cond)
{
puts("This is the whitesmiths style");
}
else if (cond)
{
puts("like it?");
}

圣战

Allman风格(左括号换行, 位于左边)和K&R风格(左括号不换行, 位于右边)是两种最广泛使用的大括号风格, 无数程序员争论到底哪种才是最好的。

在舆论上Allman总是占优, K&R被称为"过时"/"伤害眼睛”。但K&R在早期大牛的影响下(如java API源码, linux源码, golang语法风格等等)的影响下, 在除C外的领域仍然是最主流的风格。

总结

永远不存在所谓正确的缩进风格, 最重要的事情是在整个程序中都保持一致的代码风格。


参考

缩进样式 - 维基百科)

缩进样式 (catb.org)

indentation style - Slant

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道