码农的心结:编程风格

码农的心结:编程风格

Posted by 顾海军 on February 5, 2020

你平时定义一个函数的风格可能是这样的:

1
2
3
4
5
6
7
int Foo(bool isBar) {
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

然而,你团队中的一个大兄弟的风格是这样的:

1
2
3
4
5
6
7
8
int Foo(bool isBar)
{
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

或者是这样的:

1
2
3
4
5
6
7
8
9
10
int Foo(bool isBar)
{
    if (isBar)
    {
        bar();
        return 1;
    }
    else
        return 0;
}

团队开发中,由于每个开发人员的经历和成长的不同,成员中编程风格也各有特点。规定团队代码风格是保证代码可读性可维护行的基本措施之一。本文简单的介绍了一些常见的编程风格,以便参考。

常见编程风格

编程风格种类很多,优点缺点每个人有每个人的理解和说辞。存在即合理,这里介绍各编程风格特点,不去讨论编程风格长短问题。

K&R 及其变体

K&R 是 Kernighan 和 Ritchie 的缩写,即《The C Programming Language》的作者。

这里变体包括:1TBS、mandatory braces、Java、Stroustrup、BSD KNF

K&R 风格,起始大括号跟随在 arraystructenumstatement 结尾位置,但是对于 namespace, class, function 起始大括号放置于下一行的开头

1
2
3
4
5
6
7
8
int Foo(bool isBar)
{
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

K&R 变体中各编程风格均略有不同或差异

Linux Kernel/KNF

不同的缩进要求为 8 个空格。

1
2
3
4
5
6
7
8
int Foo(bool isBar)
{
        if (isFoo) {
                bar();
                return 1;
        } else
                return 0;
}

Java

不同的 function 中起始大括号跟随在函数名结尾

1
2
3
4
5
6
7
int Foo(bool isBar) {
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

Stroustrup

不同的所有起始大括号均跟随在行尾。比较特殊的 if elseelse 位于新的一行开头。

1
2
3
4
5
6
7
8
9
int Foo(bool isBar)
{
    if (isBar) {
        bar();
        return 1;
    }
    else
        return 0;
}

1TBS

不同的条件语句中单行语句不得省略大括号。

1
2
3
4
5
6
7
8
9
int Foo(bool isBar)
{
    if (isFoo) {
        bar();
        return 1;
    } else {
        return 0;
    }
}

Allman/BSD

所有起始大括号放置于下一行的开头。

1
2
3
4
5
6
7
8
9
10
int Foo(bool isBar)
{
    if (isBar)
    {
        bar();
        return 1;
    }
    else
        return 0;
}

Whitesmiths

起始大括号放置于下一行的开头且缩进,大括号内语句与大括号使用相同缩进。

1
2
3
4
5
6
7
8
9
10
int Foo(bool isBar)
    {
    if (isBar)
        {
        bar();
        return 1;
        }
    else
        return 0;
    }

VTK(Visualization Toolkit)

起始大括号放置于下一行的开头且缩进(其中函数起始大括号不要求缩进),大括号内语句与大括号使用相同缩进。

1
2
3
4
5
6
7
8
9
10
int Foo(bool isBar)
{
    if (isBar)
        {
        bar();
        return 1;
        }
    else
        return 0;
}

起始大括号均跟随在行尾,结尾大括号与大括号内语句使用相同缩进。

1
2
3
4
5
6
7
8
int Foo(bool isBar) {
    if (isBar) {
        bar();
        return 1;
        }
    else
        return 0;
    }

GNU

起始大括号放置于下一行的开头,只有函数内部大括号可以缩进,缩进通常为 2 个空格。

1
2
3
4
5
6
7
8
9
10
int Foo(bool isBar)
{
  if (isBar)
    {
      bar();
      return 1;
    }
  else
    return 0;
}

Horstmann

起始大括号放置于下一行的开头,起始大括号后跟首行代码,缩进通常为 3 个空格。

1
2
3
4
5
6
7
8
int Foo(bool isBar)
{  if (isBar)
   {  bar();
      return 1;
   }
   else
      return 0;
}

Pico

起始大括号放置于下一行的开头,后跟首行代码。结尾大括号跟随代码库最后一行代码,缩进通常为 2 个空格。

1
2
3
4
5
6
int Foo(bool isBar)
{  if (isBar)
   {  bar();
      return 1; }
    else
      return 0; }

Lisp

起始大括号均跟随在行尾,结尾大括号跟随代码库最后一行代码。

1
2
3
4
5
6
int Foo(bool isBar) {
    if (isBar) {
        bar()
        return 1; }
    else
        return 0; }

#参考

https://en.wikipedia.org/wiki/Indentation_style https://www.kernel.org/doc/html/v4.15/translations/zh_CN/coding-style.html