本文翻译自 Qt Coding Style

本文是对 Qt 底层代码规范的概述。对于上层代码规范,参见 Coding Conventions

本文的信息来自于 Qt 的源代码、论坛、电子邮件以及开发者之间的合作。

为避免在代码样式上耗费过多时间,Qt 项目正在寻找一种自动化代码排版的解决方案。

缩进

  • 使用 4 个空格进行缩进
  • 不要使用制表符 tab

声明变量

  • 每一行只声明一个变量

  • 避免使用过短或无意义的变量名(e.g. “a”,“rbarr”,“nughdeget”)

  • 简短的变量名只适用于计数变量、临时变量等变量的用途十分明显的场合

  • 变量应在使用时声明

    // Wrong
    int a, b;
    char *c, *d;
    
    // Correct
    int height;
    int width;
    char *nameOfThis;
    char *nameOfThat;
    
  • 变量名及函数名以小写字母开头,随后每个单词的首字母大写

  • 避免缩写

    // Wrong
    short Cntr;
    char ITEM_DELIM = ' ';
    
    // Correct
    short counter;
    char itemDelimiter = ' ';
    
  • 类名总是以大写字母开头。公共类的类名要加前缀 “Q”,随后每个单词首字母大写(如:QRgb)。公共函数则常常加前缀 “q”(如:qRgb)。

  • 首字母缩略词遵循驼峰拼写法(e.g. QXmlStreamReader,而非 QXMLStreamReader)。

间隔

  • 在合适的地方使用空行来组织语句

  • 不连续使用多个空行

  • 在关键词之后、大括号之前使用一个空格来做分隔:

    // Wrong
    if(foo){
    }
    
    // Correct
    if (foo) {
    }
    
  • 对于指针及引用,总是在类型与 “*” 或 “&” 之间加一个空格,但是在 “*” 或 “&” 与变量名之间不加空格:

    char *x;
    const QString &myString;
    const char * const y = "hello";
    
  • 二元运算符两侧应各加一个空格

  • 每个逗号之后应加一个空格

  • 在强制类型转换之后不应有空格

  • 尽量避免使用 C 风格的强制类型转换

    // Wrong
    char* blockOfMemory = (char* ) malloc(data.size());
    
    // Correct
    char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
    
  • 每行只写一条语句

  • 控制流语句的主体应另起一行:

    // Wrong
    if (foo) bar();
    
    // Correct
    if (foo)
        bar();
    

大括号(花括号)

  • 大括号贴附:左大括号应与前一条语句在同一行。如果右大括号之后跟一关键字,则该关键字应与右大括号在同一行:

    // Wrong
    if (codec)
    {
    }
    else
    {
    }
    
    // Correct
    if (codec) {
    } else {
    }
    
  • 例外情况:函数实现(不包括 lambda 表达式)以及类声明的左大括号总是另起一行:

    static void foo(int g)
    {
        qDebug("foo: %i", g);
    }
    
    class Moo
    {
    };
    
  • 仅当条件语句的主体不止一行时才使用大括号:(PS:个人建议一律使用大括号)

    // Wrong
    if (address.isEmpty()) {
        return false;
    }
    
    for (int i = 0; i < 10; ++i) {
        qDebug("%i", i);
    }
    
    // Correct
    if (address.isEmpty())
        return false;
    
    for (int i = 0; i < 10; ++i)
        qDebug("%i", i);
    
  • 例外情况 1:如果条件语句有多行或者换行,则应主体使用大括号:

    // Correct
    if (address.isEmpty() || !isValid()
        || !codec) {
        return false;
    }
    
  • 例外情况 2:大括号对称:在 if-then-else 语句块中,如果有 if 块或 else 块的主体语句不止一行,则其他块也应使用大括号:

    // Wrong
    if (address.isEmpty())
        qDebug("empty!");
    else {
        qDebug("%s", qPrintable(address));
        it;
    }
    
    // Correct
    if (address.isEmpty()) {
        qDebug("empty!");
    } else {
        qDebug("%s", qPrintable(address));
        it;
    }
    
    // Wrong
    if (a)else
        if (b)// Correct
    if (a) {} else {
        if (b)}
    
  • 当条件语句的主体为空时,也要使用大括号

    // Wrong
    while (a);
    
    // Correct
    while (a) {}
    

小括号(圆括号)

  • 使用小括号来对表达式进行分组:

    // Wrong
    if (a && b || c)
    
    // Correct
    if ((a && b) || c)
    
    // Wrong
    a + b & c
    
    // Correct
    (a + b) & c
    

switch 语句

  • case 应与 switch 保持在同一列

  • 每个 case 语句块应以 break 或 return 语句结束,或者使用 Q_FALLTHROUGH 来表示故意不中断,或者 case 后为空直接接下一个 case。

    switch (myEnum) {
    case Value1:
        doSomething();
        break;
    case Value2:
    case Value3:
        doSomethingElse();
        Q_FALLTHROUGH();
    default:
        defaultHandling();
        break;
    }
    

跳转语句(break,continue,return 和 goto)

  • 不要在跳转语句后跟 “else”:

    // Wrong
    if (thisOrThat)
        return;
    else
        somethingElse();
    
    // Correct
    if (thisOrThat)
        return;
    somethingElse();
    
  • 例外情况:若代码本身是对称的,则允许使用 “else” 来达到视觉上的对称

换行

  • 每一行的长度应小于 100 个字符;必要时换行

  • 注释或函数说明行的长度应在 80 列实际文本以下。调整周围文本,避免出现“锯齿状”的段落。

  • 逗号出现在换行行的行尾,运算符出现在新行的行首。如果编辑空间太窄,则很容易忽略行尾的操作符。

    // Wrong
    if (longExpression +
        otherLongExpression +
        otherOtherLongExpression) {
    }
    
    // Correct
    if (longExpression
        + otherLongExpression
        + otherOtherLongExpression) {
    }
    

一般例外情况

  • 如果严格遵循规则使代码看起来很糟糕,则无须遵守。
  • 如果任何方面存在争议,则维护者对样式有最终决定权。

Artistic Style 格式化工具

artistic style 可使用以下代码片段来格式化代码。

--style=kr 
--indent=spaces=4 
--align-pointer=name 
--align-reference=name 
--convert-tabs 
--attach-namespaces
--max-code-length=100 
--max-instatement-indent=120 
--pad-header
--pad-oper

注意,对 --max-instatement-indent 的使用,是因为 astyle 不够智能,当后续行需要缩进缩进限制时,无法在第一个参数处换行。建议手动将语句内缩进(in-statement-indent)限制在约 50 列以内:

    int foo =  
 some_really_long_function_name(and_another_one_to_drive_the_point_home(
            first_argument, second_argument, third_arugment));
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐