QT之编码风格(low-level)

亡梦爱人 提交于 2020-03-05 15:33:25

原文:https://wiki.qt.io/Qt_Coding_Style

缩进


  • 用4个空格进行缩进
  • 是空格,不是tab

声明变量


  • 在单独的一行声明每一个变量
  • 避免过短或者无意义的变量名(例如:“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’跟上一个大写字母开始。公共函数大多以字母’q’开始。
  • 首字母缩略词是驼峰式的(e.g. QXmlStreamReader, not 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 {
 }
  • 例外:函数实现(但不包括lambdas)和类声明始终在行首处使用左括号:
 static void foo(int g)
 {
     qDebug("foo: %i", g);
 }

 class Moo
 {
 };
  • 仅当条件语句的主体包含多行时才使用花括号
 // 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
     

分支语句


  • case标签与switch关键字在同一列
  • 每个case的末尾都必须有一个break(或return)语句,或者使用Q_FALLTHROUGH()表示故意没有中断,除非立即发生另一case。
 switch (myEnum) {
 case Value1:
   doSomething();
   break;
 case Value2:
 case Value3:
   doSomethingElse();
   Q_FALLTHROUGH();
 default:
   defaultHandling();
   break;
 }

跳转语句 (break, continue, return, and 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) { }
发布了160 篇原创文章 · 获赞 45 · 访问量 2万+
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!