[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今回作成するプログラム(ゲーム用のライブラリおよびノベルゲームエンジン)のコーディングルールは以下の通りとする
また、個人的なプログラムは基本的に以下のコーディングルールに合わせること
○インデントはタブのみ、スペースによる調整は行わない
○コード中の空白は基本的に自由とするが、これ以降に記述されるサンプルに合わせることを推奨する
○コメントは、//スタイルを基本とし、コードをコメントアウトするときに/**/スタイルを使用する
コードのコメントアウトが多重になるときは#ifを使用しても良いが、推奨しない
○関数宣言の後ろには必ず関数について簡単なコメントを書くこと(VisualStudioで関数の説明が出るように)
○コメントの上下の飾りは基本的に禁止する(一つのファイルにクラスを複数書く場合など、栞が欲しい場合などにつけるのはかまわない)
○後に変更をくわえたい箇所には、//の後にTODO:をつけてコメントをすること
○ブロック文は以下とする
ex:
if( hoge ){
fuga;
}
○if文について
・条件式が長くなる場合は、意味単位で分割する
ex 1:
if( (hoge.IsHit() && hoge.IsDraw() ) ||
(fuga.IsHit() && fuga.IsDraw() ) ){
piyo;
}
ex2:
if( hoge.IsHit() && hoge.IsDraw() ){
if( fuga.IsHit() && fuga.IsDraw() ){
piyo;
}
}
ex3:
bool isHoge = hoge.IsHit() && hoge.IsDraw();
bool isFuga = fuga.IsHit() && fuga.IsDraw();
if( isHoge || isFuga){
piyo;
}
上記3例のように書くことが望ましい(時々に応じてわかりやすい書き方であること)
また、ex1の場合は、3行以上の時には改行周りを統一すること
ex1.1:
if( hoge.IsHit() ||
fuga.IsHit() ||
piyo.IsHit() ){
nyoro;
}
・基本的にif文の後ろに単文を書くことは禁止する
ただし、以下のように書くならば例外的に使用しても良い
ex:
if( hoge.IsHit() ) nyoro;
逆に言えば、これ以外で一行に二つ以上の文を書くのは原則禁止とする
○for文について
・無限ループはfor文で行うこと
ex:
for(;;){}
for文も基本的に後ろに単文を書くことは禁止する
・あまりにも長い初期化、継続条件、再初期化式は書かないこと
多くても各2式程度を推奨する
ex:
for( int i = 0, int j = 0; i < x && j < y; ++i, ++j){}
○while、do-while文について
・あまりに長い継続条件式は書かないこと
これについても基本的に後ろに単文を書くことは禁止とする
○switch文について
・基本的には以下のように書くこと
ex1:
switch( c ){
case 'a':
hoge();
break;
case 'b':
fuga();
break;
default:
error();
break;
}
breakが無い場合は理由のコメントなどを書くこと
defaultは絶対に記述すること(エラー処理がない場合、assertを仕込むことを推奨)
また、switch内でローカル変数を宣言するときは、ブロック文を使用すること
ex1.1
switch( c ){
case 'a':
{
int i;
}
break;
~~以下略~~
ただし、それぞれのケースが十分に短い(上記など)場合は、以下のように簡略化してもよい
ex1.2:
switch( c ){
case 'a': hoge() break;
case 'b': fuga() break;
default:
error();
break;
}
上記、defaultの時はエラー処理なので分けたが、エラーでないときは同様に記述してもよい
○変数宣言について
・基本的に一行一変数とする
また、すぐに初期化を行うこと
とくに何らかの理由でメモリを確保したときは、すぐに他の値を代入する場合でも0クリアを行うことを推奨する
ex:
int i = 0;
int* pi = &i;
char* pc = new char[1024];
memset( pc, 0, 1024);
・例外として、ポインタ変数でない(特に組み込み)型については一行で複数宣言しても良いこととする
ただし、すぐに初期化を行うこと
ex:
double a,v;
a = hoge.GetAccel();
v = hoge.GetVelocity();
○関数定義、関数コールについて
・引数が多く、一行で書くには長すぎる関数の時は、以下のように書くことを推奨する
ex:
hoge( a,
b,
c,
d,
e)
{
}
hoge( a,
b,
c,
d,
e);
○クラス定義について
・以下に概略を書く
ex:
class hoge : public fuga
{
public:
enum、定数など
static関数
内部クラス
コンストラクタ、デストラクタ
関数
変数
static変数
protected:
同上
private:
同上
};
基本的には上記順番とする
ただし、何らかの理由で特定の要素を強調したい(隠したい)場合は変更してもかまわない
たとえば構造体的要素の強い物に関しては、変数の優先順位を上げることが望ましいし、
コンストラクタを隠してCreate関数を用意する場合は、コンストラクタ、デストラクタの位置に
Create関数を記述し、コンストラクタは一番下に置くことが望ましい
○命名規則
・型名(class,struct,enum,typedef)は先頭を大文字とし、後ろに小文字が続くようにする
また、複数の単語をつなげた場合、単語の先頭については大文字にする(アッパーキャメル)
・定数(enum, static constデータメンバ,const変数など)はすべて大文字とし、
複数の単語をつなげた場合は単語の間にアンダースコアを入れる
・関数は型名と同じくアッパーキャメルとする
ただし、C言語のマクロのようなテンプレートなどは定数と同じ記述にしても良い(SAFE_DELETEなど)
・変数は先頭を小文字とし、後ろに小文字が続くようにする
また、複数の単語をつなげた場合、単語の先頭については大文字にする(ローワーキャメル)
ex:
class HogeObject;
enum EnumHoge{
HOGE_A,
HOGE_B,
HOGE_C,
}
int GetFuga();
double piyoNyoro;
・関数については、以下の規則を追加する
クラスからメンバ変数を取得する/書き換える関数はGet/Setを頭につける
constに出来る場合は積極的につける
引数がconstに出来る場合は積極的につける
ポインタではなく参照を使える場合はポインタを使わない
・変数については、以下の規則を追加する
グローバル変数は先頭をgとする(仕様を推奨するものではない)
メンバ変数は先頭をmとする ただし構造体的なクラスのpublicメンバについてはつけなくても良い//09/1/17追記 これ要らないのに書いてた……
引数がメンバ変数や関数内のローカル変数と被る場合、先頭にaをつけて識別しても良い
ポインタには先頭にpをつけることを推奨する また、ポインタへのポインタには先頭にppをつけることを推奨する
上記以外のシステムハンガリアンは原則禁止とするが、アプリケーションハンガリアンは非常に推奨する
ex:
void *pEncScriptData; //暗号化してあるスクリプトデータ
void *pDecScriptData; //復号化したスクリプトデータ
参考:http://local.joelonsoftware.com/mediawiki/index.php/%e9%96%93%e9%81%95%e3%81%a3%e3%81%9f%e3%82%b3%e3%83%bc%e3%83%89%e3%81%af%e9%96%93%e9%81%95%e3%81%a3%e3%81%a6%e8%a6%8b%e3%81%88%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b
○その他について
・複数の演算子を使用している式については、積極的に括弧を使用することを推奨する
・変数のスコープは出来る限り最短にし、ループ内で宣言する変数を外に出した方が早い、などの最適化は行わないこと
上記のような最適化はコンパイラに期待するか、最終的なデバグ段階で必要な最適化だと分かってから行うことにする
・グローバル変数は出来るだけ使用しないこと
・usingのヘッダファイルでの使用は禁止する //2009/1/6 追記
上記を今プロジェクトのコーディングルールとする
不具合があった場合、変更がある可能性はあるが、基本的に上記のみで変更は無いものとする
参考文献:ゲームプログラマになる前に覚えておきたい技術 付属CD
//修正履歴 2009/1/6 コーディングルール本体を続きに移動
// その他追記
//2009/1/17 メンバ変数の命名規則削除