日本語 English Spanish 简体中文 Русский

Qt コーディングスタイル

これは Qt のコードを書く際に私たちが使用しているコーディング規約の概要です。ここにある情報は Qt のソースやフォーラム・メーリングリスト上の議論、開発者同士のコラボレーションに基づいています。

インデント

  • インデントは 4 つの空白である
  • タブではなく空白を使用する

変数の宣言

  • 変数の宣言は 1 行に 1 つのみ
  • 出来る限り短い変数名は避ける(“a”, “rbarr”, “nughdeget” など)
  • 一文字の変数名は、カウンタや一時変数で使用目的が明白である場合に限り認められる
  • 本当に必要になるまで変数の宣言はしない

  1.         // 間違い
  2.         int a, b;
  3.         char *c, *d;
  4.    
  5.         // 正しい
  6.         int height;
  7.         int width;
  8.         char *nameOfThis;
  9.         char *nameOfThat;

  • 変数名と関数名は小文字から始まり、名前の中の各単語は大文字から始まる
  • 短縮形は避ける

  1.         // 間違い
  2.         short Cntr;
  3.         char ITEM_DELIM = '\t';
  4.    
  5.         // 正しい
  6.         short counter;
  7.         char itemDelimiter = '\t';

  • クラス名は常に大文字から始まる。パブリックなクラスは Q から始まる(QRgb)。パブリックな関数は大抵の場合 q で始まる(qRgb)。

空白

  • 処理を適切にまとめるために空白行を使う
  • 空白行を 1 行以上続けない
  • キーワードの後と波括弧の前には空白を 1 つ入れる

  1.         // 間違い
  2.         if(foo){
  3.         }
  4.    
  5.         // 正しい
  6.         if (foo) {
  7.         }

  • ポインタや参照においては、型名と * または & の間には空白を入れる。変数名と * または & の間には空白は入れない。

  1.         char *x;
  2.         const QString &myString;
  3.         const char * const y = "hello";

  • ビット演算子の前後には空白をいれる
  • キャストの後には空白を入れない
  • C スタイルのキャストは可能な限り避ける

  1.         // 間違い
  2.         char* blockOfMemory = (char* ) malloc(data.size());
  3.    
  4.         // 正しい
  5.         char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));

波括弧

  • 基本的に、左波括弧はステートメントの開始行に置く

  1.         // 間違い
  2.         if (codec)
  3.         {
  4.         }
  5.    
  6.         // 正しい
  7.         if (codec) {
  8.         }

  • 例外:関数の実装とクラスの宣言では左括弧は常に新しい行の初めに置く

  1.         static void foo(int g)
  2.         {
  3.             qDebug("foo: %i", g);
  4.         }
  5.    
  6.         class Moo
  7.         {
  8.         };

  • 条件文では、内部の処理が 1 行を超える場合、または 1 行の処理が複雑な場合のみ、波括弧を使用する

  1.         // 間違い
  2.         if (address.isEmpty()) {
  3.             return false;
  4.         }
  5.    
  6.         for (int i = 0; i < 10; ++i) {
  7.             qDebug("%i", i);
  8.         }
  9.    
  10.         // 正しい
  11.         if (address.isEmpty())
  12.             return false;
  13.    
  14.         for (int i = 0; i < 10; ++i)
  15.             qDebug("%i", i);

  • 例外1:条件式が複数にまたがる場合は波括弧を使用する

  1.         // 正しい
  2.         if (address.isEmpty() || !isValid()
  3.             || !codec) {
  4.             return false;
  5.         }

  • 例外2:if-else 式のいずれかの処理が複数行にまたがる場合、全てに波括弧を使用する

  1.         // 間違い
  2.         if (address.isEmpty())
  3.             return false;
  4.         else {
  5.             qDebug("%s", qPrintable(address));
  6.             ++it;
  7.         }
  8.    
  9.         // 正しい
  10.         if (address.isEmpty()) {
  11.             return false;
  12.         } else {
  13.             qDebug("%s", qPrintable(address));
  14.             ++it;
  15.         }
  16.    
  17.         // 間違い
  18.         if (a)
  19.             if (b)
  20.                 ...
  21.             else
  22.                 ...
  23.    
  24.         // 正しい
  25.         if (a) {
  26.             if (b)
  27.                 ...
  28.             else
  29.                 ...
  30.         }

  • 条件文の内部が空の場合は波括弧を使用する

  1.         // 間違い
  2.         while (a);
  3.    
  4.         // 正しい
  5.         while (a) {}

丸括弧

  • 式をまとめる為に丸括弧を使用する

  1.         // 間違い
  2.         if (a && b || c)
  3.    
  4.         // 正しい
  5.         if ((a && b) || c)
  6.    
  7.         // 間違い
  8.         a + b & c
  9.    
  10.         // 正しい
  11.         (a + b) & c

switch 文

  • case は switch と同じインデントで記述する
  • 全ての case は break (または return) で終了しなければならない。意図的に break しない場合はその旨をコメントで記述する。複数の case を続けて記述する場合は例外。

  1.         switch (myEnum) {
  2.         case Value1:
  3.             doSomething();
  4.             break;
  5.         case Value2:
  6.         case Value3:
  7.             doSomethingElse();
  8.             // fall through
  9.         default:
  10.             defaultHandling();
  11.             break;
  12.         }

改行

  • 1 つの行は 100 文字以内に収める。必要であれば改行を挿入する。
  • 複数行に分割する場合、カンマは行の最後に置き、演算子は行の最初に置く。エディタの幅が小さい場合、行の最後にある演算子は見逃しやすい。

  1.         // 正しい
  2.         if (longExpression
  3.             + otherLongExpression
  4.             + otherOtherLongExpression) {
  5.         }
  6.    
  7.         // 間違い
  8.         if (longExpression +
  9.             otherLongExpression +
  10.             otherOtherLongExpression) {
  11.         }

継承と virtual キーワード

  • virtual 関数を再実装する場合、ヘッダファイルに virtual キーワードを使用 しない こと

例外

  • コードの見栄えを良くするという理由に限り以上のルールを破っても良い

Categories: