Outdated version of the documentation. Find the latest one here.

QGISコーディング基準

これらの基準は、すべてのQGIS開発者が守るべきです。

クラス

名前

QGISのクラスは、Qgsで始まり、キャメルケースを使用して形成されています。

例:

  • QgsPoint
  • QgsMapCanvas
  • QgsRasterLayer

メンバー

クラスメンバー名は小文字のmで始まり、大文字と小文字を使用して形成されています。

  • mMapCanvas
  • mCurrentExtent

すべてのクラスメンバーはプライベートにしましょう。パブリックのクラスメンバーは極力避けるように して ください。保護されたメンバーはPythonバインディングから使用できないため、メンバーがPythonのサブクラスからアクセスする必要がある場合は、保護されたメンバーを使用しないでください。

Mutable static class member names should begin with a lower case s, but constant static class member names should be all caps:

  • sRefCounter
  • DEFAULT_QUEUE_SIZE

アクセサ関数

クラスのメンバー値はアクセサ関数を通じて取得しましょう。関数は、get接頭辞なしの名前を付ける必要があります。上記2つのプライベートメンバーのためのアクセサ関数は次のようになります。

  • mapCanvas()
  • currentExtent()

アクセサが正しく const でマークされていることを確認してください。適切な場合には、これはキャッシュされた値型のメンバー変数が mutable でマークされていることを要求することができます。

関数

関数名は小文字で始まり、大文字と小文字を使用して形成されています。関数名は、その関数の目的について何かを伝える必要があります。

  • updateMapExtent()
  • setUserOptions()

既存のQGISのAPIとQtのAPIとの一貫性を保つために、略語は避けましょう。例えば setDestSize でなく setDestinationSizesetMaxVal でなく setMaximumValue といった形で書くようにしてください。

頭字語についても同様に、一貫性を保つためにキャメルケースにする必要があります。例えば、 setXML でなく setXml と書くようにしてください 。

関数引数

Function arguments should use descriptive names. Do not use single letter argments (e.g. setColor( const QColor& color ) instead of setColor( const QColor& c )).

引数が参照渡しされなければならないときには細心の注意を払ってください。引数オブジェクトが(例えばのQPointオブジェクトなど)小さくて自明にコピーされたものでない限り、それらはconst参照によって渡しましょう。QtのAPIとの一貫性を保つために、暗黙のうちにも、共有オブジェクトは代わりに const参照によって渡されます(例えば、 setTitle( QString title ) でなく setTitle( const QString& title )

関数戻り値

Return small and trivially copied objects as values. Larger objects should be returned by const reference. The one exception to this is implicitly shared objects, which are always returned by value.

  • int maximumValue() const
  • const LayerSet& layers() const
  • QString title() const (QString is implicitly shared)
  • QList< QgsMapLayer* > layers() const (QList is implicitly shared)

Qtデザイナ

作成されたクラス

Qtデザイナ(UI)ファイルから生成されるQGISクラスはベースのサフィックスを持つ必要があります。これは、生成された基本クラスとしてクラスを識別します。

例:

  • QgsPluginManagerBase
  • QgsUserOptionsBase

ダイアログ

すべてのダイアログには、すべてのツールバーアイコンおよびその他の関連するウィジェットのツールチップヘルプを実装する必要があります。ツールチップは、新規および経験豊富なユーザーのために機能の見つけやすさを大きく追加します。

ウィジェットのタブ順序は、ダイアログの変更のたびレイアウトを更新していることを確認します。

C ++ファイル

名前

C ++の実装とヘッダーファイルは、それぞれ拡張子.cppと.hを持つ必要があります。ファイル名はすべて小文字で、クラスの場合、クラス名と一致する必要があります。

Example: Class QgsFeatureAttribute source files are qgsfeatureattribute.cpp and qgsfeatureattribute.h

ノート

上記の文から明確ではない場合は、ファイル名がクラス名と一致するために、それは各クラスが独自のファイルで宣言され実装されるべきであることを暗黙的に意味します。これにより、新参者にとってコードが特定のクラスにどこで関連しているか特定するのがはるかに容易になります。

標準的なヘッダとライセンス

各ソースファイルには以下の例に従ってパターン化されたヘッダセクションがあるようにしてください:

/***************************************************************************
  qgsfield.cpp - Describes a field in a layer or table
  --------------------------------------
  Date : 01-Jan-2004
  Copyright: (C) 2004 by Gary E.Sherman
  Email: sherman at mrcc.com
/***************************************************************************
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 ***************************************************************************/

ノート

git中にはQt Creatorのためのテンプレートがあります。それを使用するには、 doc/qt_creator_license_template からそれをローカルの場所にコピーし、メールアドレスと名前を(必要ならば)修正し、それを使用するようにQtCreatorを設定します ツール ‣ オプション ‣ C++ ‣ ファイル命名

変数名

ローカル変数名は小文字で始まり、大文字と小文字を使用して形成されています。my あるいは the といった文字列を前に付けないでください。

例:

  • mapCanvas
  • currentExtent

列挙型

列挙型は、最初が大文字のキャメルケースで命名する必要があります、例えば:

enum UnitType
{
  Meters,
  Feet,
  Degrees,
  UnknownUnit
};

他のタイプと競合するジェネリック型の名前を使用しないでください。例えば Unknown よりむしろ UnkownUnit を使用してください

グローバル定数&マクロ

グローバル定数とマクロは大文字のアンダースコア区切りなどで書かれる必要があります。

const long GEOCRS_ID = 3344;

Qtのシグナルとスロット

すべてのシグナル/スロットコネクトは、「新しいスタイル」を使用して行われるべきであるQt5で利用できる接続します。この要件のFuther情報は、 QEP #77 で利用可能です。

Qt自動接続スロット(すなわち void on_mSpinBox_valueChanged と名前付けされたもの)の使用を避けてください。自動接続スロットはダイアログがリファクタリングされている場合は、警告なしに破損し、脆弱となりやすいです。

編集

任意のテキストエディタ/IDEは、次の要件が満たされているとすれば、QGISコードを編集するために使用できます。

タブ

スペースでタブを代替するようにエディタを設定します。タブ間隔はスペース2つに設定する必要があります。

ノート

vim中ではこれは set expandtab ts=2 でなされます

字下げ

Source code should be indented to improve readability. There is a scripts/prepare-commit.sh that looks up the changed files and reindents them using astyle. This should be run before committing. You can also use scripts/astyle.sh to indent individual files.

As newer versions of astyle indent differently than the version used to do a complete reindentation of the source, the script uses an old astyle version, that we include in our repository (enable WITH_ASTYLE in cmake to include it in the build).

中括弧

中括弧は、表現の次の行に開始する必要があります:

if(foo == 1)
{
  // do stuff
  ...
}
else
{
  // do something else
  ...
}

APIの互換性

There is API documentation for C++.

私たちはAPIを安定かつ下位互換的なものに維持しようとしています。APIへのクリーンアップは、Qtのソースコード例と同様の方法で行われるべきです

class Foo
{
  public:
    /** This method will be deprecated, you are encouraged to use
     *  doSomethingBetter() rather.
     *  @deprecated doSomethingBetter()
     */
    Q_DECL_DEPRECATED bool doSomething();

    /** Does something a better way.
     *  @note added in 1.1
     */
    bool doSomethingBetter();

  signals:
    /** This signal will be deprecated, you are encouraged to
     *  connect to somethingHappenedBetter() rather.
     * @deprecated use somethingHappenedBetter()
     */
#ifndef Q_MOC_RUN
    Q_DECL_DEPRECATED
#endif
    bool somethingHappened();

    /** Something happened
     *  @note added in 1.1
     */
    bool somethingHappenedBetter();
}

コーディングスタイル

ここに、うまくいけばエラー、開発時間およびメンテナンスを減らすいくつかのプログラミングのヒントが記載されています。

可能なかぎりコードを一般化しましょう

コードをカット&ペーストしている、あるいは複数回同じことを書いている場合は、単一の関数にコードを統合することを検討してください。

これにより:

  • 変更は複数の場所ではなく一箇所で行うことを可能にします

  • コードの膨張を防ぐのを助けます

  • 複数のコピーが時間につれて違いを進化させること、したがって他人が理解して維持管理するのを難しくすること、がより起こりにくくします

述語中で定数は最初にしましょう

述語中では最初に定数を置くことを好みます。

value == 0 の代わりに 0 == value

これにより、プログラマが == を使用するつもりで誤って = を使用することを防げます、それは非常に微妙な論理的バグになる。比較のための == の代わりに誤って = を使用している場合、 定数には本質的に値を割り当てできませんから、コンパイラでエラーが発生します。

空白は友達になりえます

演算子、ステートメント、および関数の間にスペースを追加すると、人間がコードを簡単に解析できるようになります。

より読みやすいのは、こちら:

if (!a&&b)

またはこちら:

if ( ! a && b )

ノート

scripts/prepare-commit.sh will take care of this.

コマンドは別々の行に入れましょう

コードを読み取るとき、行の先頭にない場合は、コマンドを見逃しやすくなります。すぐにコードを読むとき、それらは最初の数文字で探しているもののように見えない場合、行を読み飛ばすのが一般的です。 if のような条件の後にコマンドを期待することも一般的です。

考えてみましょう:

if (foo) bar();

baz(); bar();

制御のどのような流れの一部を見逃すのは非常に簡単です。代わりに使用します

if (foo)
  bar();

baz();
bar();

アクセス修飾子を字下げしましょう

アクセス修飾子は、公開API、保護されたAPIとプライベートAPIのセクションにクラスを構造化します。アクセス修飾子自体はこのような構造にコードをグループ化します。アクセス修飾子と宣言を字下げしてください。

class QgsStructure
{
  public:
    /**
     * Constructor
     */
     explicit QgsStructure();
}

お奨めの読み物

Qt Quarterlyからの Qtスタイル(API)の設計 についてこの記事もお読みください。

貢献のためのクレジット

新機能の貢献者は、以下の手段によりその貢献について人々に知らせることをお勧めします: