これらの基準は、すべてのQGIS開発者が守るべきです。
クラスメンバー名は小文字のmで始まり、大文字と小文字を使用して形成されています。
すべてのクラスメンバーはプライベートにしましょう。パブリックのクラスメンバーは極力避けるように して ください。保護されたメンバーはPythonバインディングから使用できないため、メンバーがPythonのサブクラスからアクセスする必要がある場合は、保護されたメンバーを使用しないでください。
Mutable static class member names should begin with a lower case s, but constant static class member names should be all caps:
クラスのメンバー値はアクセサ関数を通じて取得しましょう。関数は、get接頭辞なしの名前を付ける必要があります。上記2つのプライベートメンバーのためのアクセサ関数は次のようになります。
アクセサが正しく const でマークされていることを確認してください。適切な場合には、これはキャッシュされた値型のメンバー変数が mutable でマークされていることを要求することができます。
関数名は小文字で始まり、大文字と小文字を使用して形成されています。関数名は、その関数の目的について何かを伝える必要があります。
既存のQGISのAPIとQtのAPIとの一貫性を保つために、略語は避けましょう。例えば setDestSize でなく setDestinationSize 、 setMaxVal でなく 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.
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 といった文字列を前に付けないでください。
例:
列挙型は、最初が大文字のキャメルケースで命名する必要があります、例えば:
enum UnitType
{
Meters,
Feet,
Degrees,
UnknownUnit
};
他のタイプと競合するジェネリック型の名前を使用しないでください。例えば Unknown よりむしろ UnkownUnit を使用してください
すべてのシグナル/スロットコネクトは、「新しいスタイル」を使用して行われるべきであるQt5で利用できる接続します。この要件のFuther情報は、 QEP #77 で利用可能です。
Qt自動接続スロット(すなわち void on_mSpinBox_valueChanged と名前付けされたもの)の使用を避けてください。自動接続スロットはダイアログがリファクタリングされている場合は、警告なしに破損し、脆弱となりやすいです。
任意のテキストエディタ/IDEは、次の要件が満たされているとすれば、QGISコードを編集するために使用できます。
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).
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)の設計 についてこの記事もお読みください。
新機能の貢献者は、以下の手段によりその貢献について人々に知らせることをお勧めします:
コードが組み込まれた最初のバージョンの更新履歴にメモを追加すること、以下のタイプで:
This feature was funded by: Olmiomland http://olmiomland.ol
This feature was developed by: Chuck Norris http://chucknorris.kr
writing an article about the new feature on a blog, and add it to the QGIS planet http://plugins.qgis.org/planet/
以下に自分の名前を追加すること: