SDXFrameWork  0.07
SDXFrameWork
 全て クラス ネームスペース 関数 変数 列挙型 列挙型の値 ページ
SDXコーディング規約


はじめに

C++は良い言語ですが、他の言語と同様に複雑で最悪なコードを書ける言語でもあります。
無秩序にコードを書くと、バグを生みやすく、読みにくく、修正も拡張もしにくくなる可能性が上がります。

複数のコーディングスタイルがありどちらも大した差がない場合は、どちらかに統一し無意味な議論を避ける事も重要になります

基本方針
①C++初学者のための文法制限はしない
②最適化に頼れる所は頼り、無駄な最適化は避ける
③仮引数以外の日本語識別子は基本的に避ける
④細かい部分は常識で判断する
⑤規約に問題があれば見直しを行う

適用範囲
SDXのみ対象です。
派生ライブラリやサンプルコードは命名規則に準拠せず、英語以外の識別子を必要な時に使います。

参考
以下のページや書籍等を参考にしたり反面教師にしたりしています
クラスライブラリ開発のデザインガイドライン
Google C++スタイルガイド
Effective C++(書籍)

命名規則

コードの一貫性を保つ上で、最も重要ですが常識に頼ると統一出来ない部分です

基本
無理の無い範囲でわかりやすくする。一般的ではない省略は行わない。

ファイル名
ヘッダーファイル名は、クラス名と同じにし拡張子は.hにし.hppにしない。
派生クラスをまとめて一つのファイルで実装している場合は、派生元のクラス名の後にDerivedをつけます。

プリコンパイル用のヘッダーとソースはpre_compile.cpp、stdafx.hにして下さい。

仮引数
原則的に日本語にします。
Unicode範囲内の特殊な記号は使いません
句読点などは規格非準拠なため使いません

仮引数以外の識別子
それ以外は半角英数とアンダーバーで命名します
ローマ字表記は避け、英単語を元に命名します、$記号は使いません

大文字と小文字の使い分け
先頭と単語の区切りを大文字にするのをPascal形式と言い、先頭を小文字にし単語の区切りを大文字にするのをCamel形式と言います。

クラス、構造体、メンバー関数、列挙体、列挙子、ローカルで無い定数はPascal形式

ローカル変数とメンバー変数はCamel形式

マクロはすべて大文字にして_で単語をつなぐ。ただし基本的にマクロは避けます。

名前空間はライブラリ全体を覆うものは全て大文字、それ以外はPascalにします

慣用的な命名
ループカウンタはi,j,kの順で一文字の変数を用いる
範囲ベースのループは for(auto it: 範囲ベース) とする
bool値はis~、can~にする

スタイルの統一

ヘッダーファイル
基本的にはヘッダーファイルで実装と宣言をする。
実装が不可能な場合は実装と宣言を分ける
前方宣言で十分な場合、無意味にincludeしない

可変数引数
可変数引数は使わず可変テンプレートを使います。
抽象クラスのメンバー関数に可変数引数が必要な場合は、可変テンプレートで初期化可能な型を引数にします
文字列の場合はVariadicStreamを使います

インライン関数
inlineキーワードは使わず、コンパイラの判断にまかせます。

インクルードガード
移植先の環境で使いたいコンパイラが全て #pragma onceを実装しているため。
#defineによるインクルードガードではなく、#pragma onceを使う。

条件式
基本的に右側に定数が来るようにする

キャスト
int,float,doubleの相互変換はcスタイルキャスト可。 それ以外はc++スタイルのキャストを使う。

その他

名前空間
グローバルな変数は作らず、少なくともSDX名前空間に入れる。
using namespace std;などはサンプルコード以外で行わない
DxLib名前空間は省略しない

struct
structはデータの取得と格納のみが必要な型に使う。
それ以外の機能が必要な場合はclassにする。

多重継承
インターフェースの継承以外で多重継承は使わない。

仮想クラス
純粋仮想関数を1つ以上持つクラスは、半角名の場合先頭にIをつけます。
メンバー変数を持っていてもIを付けます

アクセス制御
公開する必要の無い、関数や変数はプライベートにする。
代入か取得の片方しかしないメンバー変数はプライベートにし、Get関数とSet関数を作る。
四則演算をするようなデータメンバーはパプリックにして公開する

宣言の順番
調整中

入出力ストリーム、文字列ストリーム
ライブラリ内部では使う、利用者は使用せずにライブラリを使えるようにする。

前置インクリメント
最適化で速度的に差はほぼないが、前置インクリメントを使う

float型
基本的に使わず、doubleに統一する

nullptr
無効なポインタはNULLや0を使わずnullptrを使う

Boost
標準ライブラリを優先して使い、必要な場合はboostを使う。

C++11
VisualStudio2013で対応している範囲のみ使用可能。
C++14は不可

コメント
ソースコード管理システムに登録されるような事は書かない。
仮引数と戻り値用のドキュメントコメントは使わない
関数とクラスには一行以上の説明を必ず付ける
クラスに対してはテスト用のサンプルコードを付ける
変数と列挙子は必要なら一行で説明をつける。コメントなしで分かる変数名にするのが良い。

実装コメント
どうやっても分かりにくい場合、関数内部に説明のコメントをつける。
サンプルコードについては詳細に付けて良い

スペースとタブ
タブ幅は4とし、半角スペースを使う

括弧
括弧と括弧閉じは同じ高さ、あるいは同じ行にする。 例外としてelseを使う場合は以下の書き方にします。

//ダメ
if( x == 1 ){
func();
}
//良い
if( x == 1 )
{
func();
}
//良い
if( x == 1 )
{
func();
}else{
func2();
}