* 運用 - Employment [#g9284ebe]
#contents
Last-modified: &lastmod();

** このページについて [#ie2b0c1a]
AngelScript(以下AS)を実際にチームで運用するときの使用例や気を付けるべきことについて書きます。

** コーディング規約・運用ルールの例 [#fc028079]
チームでASを使う場合,コーディング規約をある程度決めておいた方がよいでしょう。
ここでは決めておくべき項目とその例を紹介します。

ちなみに,ここで使用している例は筆者が使っているルールです。
実際にコーディング規約を作る場合はここの例にこだわらず,
コミュニティやチームごとに親しみやすいルールで運用することをオススメします。
*** キャメルとは [#g9268c4f]
例の説明中に「キャメル」という言葉を使っています。
キャメルとはAbstractSceneやPlayerInformationのように
単語の頭が大文字,それ以外を小文字とした表記の方法のことを指します。
*** スクリプトファイル名 [#f847673c]
- 1スクリプトファイルにつき1つのクラスもしくは列挙型シンボルを記述するようにしてます。
- クラス名とファイル名は同じにします。拡張子は''.as''を使用します。
- Hogeというクラスのファイル名はHoge.asになります。
*** 列挙型・列挙型の要素 [#d6181359]
- 列挙型の名前はクラス同様キャメルを使います。
- 列挙型の各要素は,列挙型の名前 + ''_'' + キャメルで表現します。
- 終端は''TERMINATE''を使います。
- 最も小さい値は''MIN'',最も大きい値は''MAX''を使います。(この名前の付け方はD言語に合わせています)

#code(c,){{
enum ColorKind
{
    ColorKind_Red
    , ColorKind_Blue
    // term
    , ColorKind_TERMINATE
    , ColorKind_MIN = 0
    , ColorKind_MAX = ColorKind_TERMINATE-1
};
}}
*** クラス [#k376e857]
- 名前はキャメルを使います。

*** メンバ変数・メンバ関数 [#h36e4118]
- AS自体にpublicやprivateといった公開修飾子は存在しませんが,命名規則を使うことでメンバがpublicなものかprivateなものか判別つくようにしています。
- publicなメンバ変数・メンバ関数は小文字始まりのキャメルを使っています。
- privateなメンバ変数は''mv'' + キャメルを使っています。
- privateなメンバ関数は''mf'' + キャメルを使っています。

#code(c,){{
class Hoge
{
    int mvPrivateValue; // privateなメンバ変数
    int publicValue; // publicなメンバ変数
    
    int publicFunction()const { return 0; } // publicなメンバ関数
    int mfPrivateFunction()const { return 0; } // privateなメンバ関数
};
}}
*** グローバル変数・関数 [#x82046c8]
- ASコードはC++コードと違い,staticメンバ変数を持つことができません。
- それの代わりとして筆者はグローバル変数・関数を使用しているようにしてます。
- グローバル変数・関数をそれ以外の使い方としては使いません。
- 全てのグローバル変数・関数はC++コードでのstaticメンバ変数・関数に該当するという考え方です。
- publicなstaticメンバ変数・関数の名前は所属するクラス名 + ''_'' + キャメルを使います。
- privateなstaticメンバ変数の名前は所属するクラス名 + ''_'' + ''sv'' + キャメルを使います。
- privateなstaticメンバ関数の名前は所属するクラス名 + ''_'' + ''sf'' + キャメルを使います。
- 先頭に所属するクラス名をつける理由として,他のグローバル関数・変数の名前の衝突を回避する狙いがあります。

#code(C,){{
// C++のコード
class Hoge
{
public:
    static const int StaticFunction();
    static const int StaticValue;

private:
    static const int PrivateStaticFunction();
    static const int PrivateStaticValue;
};

// ASコードで書くとこう。
const int Hoge_StaticFunction();
const int Hoge_StaticValue;
const int Hoge_sfPrivateStaticFunction();
const int Hoge_svPrivateStaticValue;
}}
*** 関数の引数の修飾子 [#r2417574]
- ASコードではin,inout,outなどが使えますがこれらは使わないようにしています。
- C++コードと同じようにObject&およびconst Object&のみ使うようにしています。

#code(c,){{
class Foo
{
    int value;
};

class Hoge
{
    int mvValue;

    void readFoo( const Foo& aFoo )
    {
        mvValue = aFoo.value;    
    }

    void writeFoo( Foo& aFoo )
    {
        aFoo.value = mvValue;   
    }
};
}}

*** 名前空間を示す接頭辞 [#o58a9d77]
ASコードではC++コードの名前空間(namespace)に該当する機能がありません。(*moduleは別の機能です)
筆者は名前空間の機能を補うために,クラス名の頭に名前空間の略称を示す接頭辞をつけるようにしています。

#code(c,){{
// C++コード
namespace enemy {
    class StateAttack {};
}

// ASコード
class EnStateAttack // enemyの略称EnをStateAttackの前につけている
{
};
}}

また,C++バインドしたクラス名は頭に''App''という接頭辞をつけています。
こういった接頭辞をつける理由は,名前の衝突をさけることが1番の目的にあります。
** 使用例 - シーンごとにエンジン作成 [#s2d589a1]

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS