重要

翻訳は あなたが参加できる コミュニティの取り組みです。このページは現在 97.06% 翻訳されています。

1. QGIS コーディング基準

QGIS coding standards are described in the policy document available at QEP #314. All developers are required to follow those policies. Please note that QEP #314 is a live document, and that these policies may change over time.

1.1. クラス

1.1.1. アクセサ関数

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

1.1.2. 関数の引数

引数を参照渡しするべき場合に注意してください。オブジェクトの引数は小さくてコピーが簡単なもの (QPoint オブジェクトなど) でない限り、 const 参照で渡しましょう。 Qt の API との一貫性を保つために、暗黙的に共有されるオブジェクトは const 参照によって渡されます。 (例えば、 setTitle( QString title ) ではなく setTitle( const QString& title ))。

1.1.3. 関数の戻り値

小さくコピーが簡単なオブジェクトは値として返してください。より大きなオブジェクトは const 参照で返しましょう。この例外の一つは暗黙的に共有されるオブジェクトで、常に値で返します。 QObject またはそのサブクラスは、ポインタとして返してください。

  • int maximumValue() const

  • const LayerSet& layers() const

  • QString title() const (QString は暗黙的に共有される)

  • QList< QgsMapLayer* > layers() const (QList は暗黙的に共有される)

  • QgsVectorLayer *layer() const; (QgsVectorLayerQObject を継承)

  • QgsAbstractGeometry *geometry() const; (QgsAbstractGeometry は抽象クラスであり、おそらくキャストする必要がある)

1.2. APIドキュメント

公開 API で利用可能なすべてのクラス、メソッド、列挙型などのコードについては、 API ドキュメントを書く必要があります。

QGISはドキュメントに Doxygen を使用しています。読者に何を期待するか、エッジケースで何が起こるかの情報や、読者が探しているかもしれない他のインターフェース、ベストプラクティス、コードサンプルについてのヒントを与える、説明的で意味のあるコメントを書いてください。

1.2.1. メンバ変数

メンバ変数はふつう private セクションに入れ、ゲッタやセッタを利用できるようにしてください。エラー報告などのためのデータコンテナはこの例外です。このような場合はメンバに m の接頭辞を付けないでください。

1.3. Qt デザイナ

1.3.1. 生成されたクラス

Qt デザイナ(UI)ファイルから生成される QGIS クラスは Base という接尾辞を持つ必要があります。これは、そのクラスを生成された基本クラスとして識別します。

例:

  • QgsPluginManagerBase

  • QgsUserOptionsBase

1.3.2. ダイアログ

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

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

1.4. C ++ファイル

1.4.1. 標準ヘッダとライセンス

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

/***************************************************************************
  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のためのテンプレートがあります。それを使用するには、 それを qt_creator_license_template からローカルの場所にコピーし、メールアドレスと(必要ならば)名前を修正し、それを使用するようにQtCreatorを設定します: ツール ► オプション ► C++ ► ファイル命名

1.5. 編集

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

1.5.1. タブ

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

注釈

vim では、 set expandtab ts=2 でこれを実行できます

1.5.2. 字下げ

ソースコードは読みやすくするために字下げされるべきです。変更されたファイルを検索し、 astyle を使用してそれらを字下げし直す prepare_commit.sh ファイルがあります。これは、コミットする前に実行すべきです。また、個々のファイルを字下げするために astyle.sh を使用できます。

astyle字下げのより新しいバージョンは、ソースコード全体を字下げし直す時に使用するバージョンとは異なっているので、スクリプトでは古いastyleバージョンを使用しており、これをリポジトリに含めています(これを含めるにはビルドの際にcmakeで WITH_ASTYLE を有効にします)。

1.6. API の互換性

C++用の API documentation があります。

私たちは、APIを安定させ、後方互換性を保つように努めています。APIのクリーンアップは、Qtのソースコードと同じような方法で行ってください。例

class Foo
{
  public:
    /**
     * This method will be deprecated, you are encouraged to use
     * doSomethingBetter() rather.
     * \deprecated use 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();
}

1.7. SIP バインド

SIP ファイルの一部は、特定のスクリプトを使用して自動的に生成されます。

1.7.1. ヘッダの前処理

正しく SIP を構築するためのすべての情報は C++ のヘッダファイル内になければなりません。そのような定義のためにいくつかのマクロを利用することができます。

  • #ifdef SIP_RUN で SIP ファイル内でのみ使用するコードを生成し、 #ifndef SIP_RUN で C++ コード内でのみ使用するコードを生成してください。 #else 文を使えばこの両方を扱うことができます。

  • SIP_SKIP を使用すると、行が無効になります。

  • 以下の表記法を扱うことができます。

    • SIP_FACTORY: /Factory/

    • SIP_OUT: /Out/

    • SIP_INOUT: /In,Out/

    • SIP_TRANSFER: /Transfer/

    • SIP_PYNAME(name): /PyName=name/

    • SIP_KEEPREFERENCE: /KeepReference/

    • SIP_TRANSFERTHIS: /TransferThis/

    • SIP_TRANSFERBACK: /TransferBack/

  • private セクションは、ブロック内で #ifdef SIP_RUN 文を使用した場合を除いて表示されません。

  • SIP_PYDEFAULTVALUE(value) は、Pythonのメソッドのための別のデフォルト値を定義するために使用することができます。デフォルト値がコンマ , を含む場合は、値はシングルクォート ' で囲まなければなりません。

  • SIP_PYTYPE(type) は、Pythonのメソッドの引数のための別の型を定義するために使用することができます。型がコンマ , を含む場合は、型はシングルクォート ' で囲まなければなりません。

デモファイル、sipifyheader.h も利用できます。

1.7.2. SIP ファイルを生成する

SIP ファイルはそのための専用スクリプトを使って生成することができます。例えば次のようにします。

scripts/sipify.pl src/core/qgsvectorlayer.h > python/core/qgsvectorlayer.sip

新しく追加されたC++ファイルのSIPファイルを自動生成するには、 sip_include.sh を実行する必要があります。

SIP ファイルがソースファイル (core_auto.sip, gui_auto.sip または analysis_auto.sip) のいずれかに追加されると同時に自動的に生成されたと見なされます。テストオンは、このファイルが対応するヘッダと更新されたことを確認します。

SIPファイルを強制的に再生成するためには、 sipify_all.sh を実行しなければなりません。

1.7.3. sipify スクリプトを改善する

If some improvements are required for sipify script, please add the missing bits to the demo file sipifyheader.h and create the expected header sipifyheader.expected.sip file. This will also be automatically tested as a unit test of the script itself.

1.8. 設定

QGISのコードベースには、設定を宣言、登録、利用するための仕組みが用意されています。

  • 設定は、利用可能な実装(QgsSettingsEntryString, QgsSettingsEntryInteger, ...)のいずれかを使用して定義しなければいけません。

  • 設定は、設定ツリー(QgsSettingsTree)に統合されなければなりません。これは親ノード(QgsSettingsTreeNode)を持つコンストラクタを使う時に自動的に行われます。

  • それらは、専用のクラスかレジストリ(core、gui、app、...)で直接 const static として宣言されます。

  • 設定キーは、kebab-case を使用する必要があります。

1.9. コーディングスタイル

ここでは、うまくいけばエラーや開発時間、メンテナンスを減らすことが期待できる、プログラミングのヒントやコツを説明します。

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

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

これにより:

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

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

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

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

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

考えてみましょう:

if (foo) bar();

baz(); bar();

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

if (foo)
  bar();

baz();
bar();

1.9.3. お奨めの読み物

Qt Quarterly の記事 designing Qt style (APIs) も絶対に読むべきです。

1.10. 貢献のためのクレジット

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