こんにちはharazhiteli!
Qtで長年の経験を持つ専門家は、次のように考えました。 Habr-急に物事に!」 しかし、長年の経験を持つ専門家でさえ、簡単なことに関するそのような記事を読む必要があることがあります。これは重要だからです。 コードは、プログラミングの最も重要なコンポーネントの1つです。 そして、私たちの仕事はそれをきれいに保つことです。 この記事は、理想を目指して努力するすべてのQtプログラマーを対象としています。
もちろん、Qt Project- Qt Coding Styleに関する記事もあります。 ここにしか価値のない資料があります...
仮定番号1。 アライメント
Qtでは、4つのスペースのインデントを使用するのが一般的です。 しかし、正確には4、正確にはギャップです。 スペースに\ tまたは別のスペースを使用することはひどく悪い
仮定番号2。 変数宣言
コードの読みやすさと一般的なスタイルを決定する最も重要な仮定の1つ。 変数を宣言するための規則は、次のリストにまとめられています。
- 各変数を別々の行で宣言します
- 短い名前または簡潔な名前(「a」、「rbarr」、「nughdeget」など)は避けてください
- 変数が必要になるまで待ってから、それを宣言するだけです
- 関数と変数はcamelCaseにある必要があります
- 略語と略語を避ける
- クラスは常に大文字で始まる必要があります
- 公開クラスは、文字「Q」(QRgb)で始まり、大文字
- パブリック関数は、文字「q」で始まる必要があります(qRgb)
- 略語はPascalCaseで指定する必要があります(例:QXMLStreamReaderではなくQXmlStreamReader)
// int a, b; char *c, *d; // int height; int width; char *nameOfThis; char *nameOfThat;
// short Cntr; char ITEM_DELIM = '\t'; // short counter; char itemDelimiter = '\t';
仮定番号3。 スペース
スペースは、ソースコードをフォーマットする上で非常に重要な要素です。 コードの可読性において非常に大きな役割を果たします。
- スペースを使用して個々のコードセグメントをグループ化する
- 分離に使用できる空行は1つだけです。
- キーワードと中括弧の後には必ず1つのスペースのみを使用してください
- ポインターと参照の場合、タイプと「*」または「&」の間に常に単一のスペースを使用しますが、「*」または「&」と変数の名前の間にスペースを入れないでください
- バイナリ演算子をスペースで囲む
- キャスト後にスペースなし
- Cのようなゴーストを避けるようにしてください。
// if (foo){ } // if (foo) { }
char *x; const QString &myString; const char * const y = "hello"; MyClass *obj = new MyClass(this); bool ok; obj.report(1, &ok);
// char* blockOfMemory = (char* ) malloc(data.size()); QTextStrem newOne(..); newOne<<"Hello"<<","<<" "<<"world"; // char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size())); QTextStrem newOne(..); newOne<< "Hello" << "," << " " << "world";
仮定番号4。 ブラケット
括弧はまったく別の問題です。 彼らは、スペースのように、コードの外観と可読性において最大の役割を果たします
- 基本的な規則として、左中括弧は演算子と同じ行にあります。
- 例外 :関数とクラス宣言の実装は常に、絶対に常に新しい行に左括弧を配置します:
- 条件本体に複数の行が含まれる場合、および1行演算子が複雑な場合は中括弧を使用します
- 例外1 :親ステートメントが複数の行またはラッパーにまたがる場合も括弧を使用します
- 例外2 :if-elseブロックがif-codeまたはelse-codeが複数の行を占有している場合、ブラケットも使用します
- 演算子本体が空の場合は中括弧を使用します
static void foo(int g) { qDebug("foo: %i", g); } class Moo { public: Moo(); Moo(int a, int b); public slots: int getResult(); protected slots: void processNumbers(); private: int mineA; int mineB; int mineResult; };
// if (address.isEmpty()) { return false; } for (int i = 0; i < 10; ++i) { qDebug("%i", i); } // if (address.isEmpty()) return false; for (int i = 0; i < 10; ++i) qDebug("%i", i);
// while (a); if (expression) else // do something // while (a) {} if (expression) { } else { // do something }
// if (codec) { // do something } // if (codec) { // do something }
// if (address.isEmpty()) return false; else { qDebug("%s", qPrintable(address)); ++it; } // if (address.isEmpty()) { return false; } else { qDebug("%s", qPrintable(address)); ++it; } // if (a) if (b) ... else ... // if (a) { if (b) ... else ... }
// if (address.isEmpty() || !isValid() || !codec) return false; // if (address.isEmpty() || !isValid() || !codec) { return false; }
仮定番号5。 かっこ
括弧を使用して式をグループ化します。
// if (a && b || c) if (a + b & c) // if ((a && b) || c) if ((a + b) & c)
仮定番号6。 複数選択条件スイッチ
もちろん、これらの条件は、コーディングガイドラインの開発者と作成者が多くの議論を行う理由です。さまざまなオプションがあります。 ただし、Qtは次のオプションのみを提供します。
- caseステートメントは、switchステートメントと同じ列にある必要があります
- 各ケースは、別のケースが続くことを示すために、break(またはreturn)ステートメントまたはコメントで終了する必要があります。
switch (myEnum) { case Value1: doSomething(); break; case Value2: case Value3: doSomethingElse(); // fall through default: defaultHandling(); break; }
仮定番号7。 改行
多くの場合、次のことが起こります。大きなモニターを持つ開発者Vasyaがいます。 彼は冷静にコードを書いています。 次に、開発者のPetyaがこのコードをラップトップで開き、はっきりと確認します。コード全体を読むには、多くのスクロールが必要です。 これは読みやすさの欠陥の1つです。 Qtは救いのために何を提供していますか?
- 行を100文字以内にしてください。 必要に応じてそれらを切り取ります
- 通信は、ぶら下がり線の最後にあります。 演算子は新しい行の先頭でラップする必要があります。 行末の演算子は、エディターが狭すぎるかどうかを見ないように非常に簡単です
// if (longExpression + otherLongExpression + otherOtherLongExpression) { } QMessageBox::information(d->someObjectWithLongName, tr("A long title for mesage"), tr("A very very very very very very long body", QMessageBox::Ok, QMessageBox::Cancel); // if (longExpression + otherLongExpression + otherOtherLongExpression) { } QMessageBox::information(d->someObjectWithLongName, tr("A long title for mesage"), tr("A very very very very very very long body", QMessageBox::Ok, QMessageBox::Cancel);
UPD:コードの最後のセクションが誤って表示されます-すべての行が同じレベルにある必要があります
仮定番号8。 継承と「仮想」キーワード
この仮定では、すべてが非常に単純です。主なことは、.hファイル内の再定義されたメソッドの名前の前に「仮想」を記述しないことです。
// class MyWidget : public QWidget { ... protected: virtual void keyPressEvent(QKeyEvent *); // class MyWidget : public QWidget { ... protected: void keyPressEvent(QKeyEvent *);
仮定番号9。 一般的な例外
この仮定は、規則を破ることに何の問題もありませんが、それはあなたのコードをくする場合のみです。 これは、すべてのルールに例外があり、ルールがそれらに違反するように設計されているという事実の良い例です。
残念ながら、Qt Coding Guidelinesがコードをくする例を見つけることができませんでした。
完了
Qtでコードを記述するスタイルについての私の記事の終わりではないかと思います。 Qtに貢献するためだけに引用されていることを思い出してください。プロジェクトの開発に貢献する場合、これらの仮定を何らかの方法で使用する必要がありますが、忘れないでください-ルールを破ることができます:)。
私にとって、Qt Coding Styleはコードを書くのに最適なスタイルです。 清潔で、快適で、快適だと思います。 その使用中ずっと、コードの可読性に問題はありませんでした。 お勧めしますか? もちろんです! さらに、Qtプラットフォームのすべての新規参入者に昇進すべきなのはまさに彼だと思います。
ご清聴ありがとうございました。