Appendix B: プログラムコードの表記方法の慣行

 どんなプログラマーの集団においても、いくつかのコードを書く conventions(慣行) を持っています。どのような conventions であっても (6~7種類あり、数えきれない位の争いの原因になっています)、それに厳格に従う事が重要です。(注:但し、QuantLibライブラリーの開発者も人間ですので、時々そのルールを守っていない事もあります)そうする事によって、プログラムコードの理解を容易にします。conventionsに馴染みのある読者であれば、一目見ただけでマクロと関数の違いが判りますし、変数と変数型の名前の違いも判ります。

 下記の Listing B.1 に QuantLibライブラリーの中で使われている conventions を簡単に示します。 Sutter and Alexandrescu, 2004 のアドバイスに従い、我々は、その数を最小限にし、読みやすさを向上させる conventions にのみ限定しようと努めました。

Listing B.1 : QuantLib code conventions.の概要
#define SOME_MACRO

typedef double SomeType;

class SomeClass {
  public:
    typedef Real* iterator;
    typedef const Real* const_iterator;
};

class AnotherClass {
  public:
    void method();
    Real anotherMethod(Real x, Real y) const;
    Real member() const;   // getter, no "get"
    void setMember(Real);  // setter
  private:
    Real member_;
    Integer anotherMember_;
};

struct SomeStruct {
    Real foo;
    Integer bar;
};

Size someFunction(Real parameter,
                  Real anotherParameter) {
    Real localVariable = 0.0;
    if (condition) {
        localVariable += 3.14159;
    } else {
        localVariable -= 2.71828;
    }
    return 42;
}

 マクロはすべて大文字で書かれ、単語の間を underscore(_) で分けています。データ型(クラスや構造体など)の名前は、大文字でスタートし、いわゆるcamel体(複合語の場合は各単語の先頭を大文字にする)で書かれています。上記例ではSomeTypeのようなデータ型宣言や、SomeClassAnotherClassといったクラス名がそうなっています。しかし、データ型宣言においては、C++の標準ライブラリーに見られるような方法を真似て、違う方法をとる場合もあります。その例として、SomeClassの中の、2つのiterator型の型宣言がそうなっています(訳注:先頭文字も含めて、すべて小文字になっている)。同じような例外が、内部クラスについても存在しています。

 その他の殆どは(変数、関数、メソッド名、パラメータなど)小文字でスタートする camel体で書かれています。クラスのメンバー変数も同じ慣行に従っていますが、最後にunderscore (_) を付け足しています。そうする事によって、メソッドの中で使われるローカル変数との区別が容易になります(構造体やクラスの publicなメンバー変数には例外がよく見られます)。メソッドの中で、gettersメソッド(メンバー変数を取りだすメソッド)と setters(メンバー変数を書き込むメソッド)の間で、さらに特別な使い分け方法があります。settersメソッドでは、設定しようとするメンバー変数名の前に set を付け加え最後の underscore を取り除いた単語をメソッド名とし、gettersメソッドでは取りだす変数名の最後の underscore を取り除いた単語をメソッド名としています(getは付け足しません)。この方法は、上記コードの AnotherClassSomeStructの中で例が確認できます。

 かなり緩やかな慣行として、関数宣言や ifelseforwhiledo の後の左かっこ ( はそれらの keyword と同じ行に書くようにしています(上記コードの someFunction()がその例です)。さらに、else keyword は、その前に来る右かっこ ) と同じ行に書くようにしています。同じ方法は、while文の後に来る do 宣言でも取られています。しかし、この方式は、読みやすさの為と言うより、好みの問題と言えるので、開発者の方は、この方法が嫌であれば、自分流で書いても構わないでしょう。ここにのせている関数は、読みやすさを向上させる他の慣行例も載せています。それは、関数やメソッドの引数が、同じ行に書ききれない場合は、縦に並べて書くようにしています。

 最後ですが大事なルールとして、コードの中で、tabを使わないようにしています。その代わり4文字分のスペースを使っています。もし、ここにある慣行の内、一つだけ従うとするなら、このルールにして下さい。そうしないと、大抵の場合、他のコードエディターを使っている開発者からすると、インデントが全くうまくいっていないコードに見えてしまうでしょう。読者の方がどのようなコードエディターを使っていても、4文字スペースの方法であればうまく調整されて、読者自身が手間をかけなくともきちんと適用されているはずです。