コーディング規約

■概要

コーディング規約とは複数人でプログラムを行う場合に作成される
コーディングルールのことです。
規約を作成することでコードに統一性をもたせることができ、
可読性や保守性を高めることができます。

●規約の内容
	規約で設定する項目は「命名規則」「コーディングスタイル」
	「禁止事項」などがあり、会社やプロジェクト毎で設定する項目は異なります。

●メリット、デメリット
	・メリット
		規約を作ることでコードに統一性をもたせたり、
		問題になりえる手法などを予防することができ、
		可読性や保守を高めます。

	・デメリット
		制限をかけすぎるとでプログラマーのストレスになったり、
		一部の生産性の高いプログラマーの効率を下げることになります。

	デメリットもありますが、メリットの方が大きい場合が多いので
	できるだけ規約は作るべきです。

●規約で一番大切なこと
	規約ではそのチームにあったルールを作りますが、一番大切なことは、
	全員がその規約を守ることです。
	当たり前なことですが、規約を作ってもそれを守らないと意味がありません。

●注意点
	上の「規約で一番大切なこと」で規約を守ることと書きましたが、
	規約を守った結果、可読性や保守性が低下した場合は見直すべきです。
	コード規約のメリットにあたる部分を享受できない規約は問題があります。

■命名規則

命名規則は変数や関数、定数の名前を決めるための規約です。
規約でよく使用される記法として「ハンガリアン記法」「スネークケース」
「キャメルケース」があります。

●ハンガリアン記法
	ハンガリアン記法は変数名やクラス名の先頭や末尾に情報を付与する記法です。
	システムハンガリアンアプリケーションハンガリアンの2種類があります。

	・システムハンガリアン
		システムハンガリアンは先頭や末尾に変数の型情報などを付与します。

		pg3d_0157

		これで、宣言までさかのぼらなくても変数名を見ただけで
		型情報を知ることができます。

	・アプリケーションハンガリアン
		アプリケーションハンガリアンは変数に細かい内容を付与します。
		これによって間違った用途で使用しているコードを
		変数名で判断できるようになります。
		例えば角度はAngleと表記することがありますが、
		それが「弧度法」なのか「度数法」なのか分かりません。
		そこで弧度法に「rad」、度数法に「deg」を付与することで、
		角度の内容を明確にし、計算ミスを減らすことができます。

			例:
				float rad_angle = 0.0f;
				float deg_angle = 0.0f;

				rad_angle = 45.0f; // ラジアンなので間違い
				deg_angle = 45.0f; // 度数法なのでOK

	・ハンガリアンの現在
		ハンガリアン記法は現在推奨されていません。
		正確にいうと推奨されていないのは「システムハンガリアン」の方で、
		「アプリケーションハンガリアン」は今でも有効とされています。

●キャメルケース
	キャメルケースは変数名や関数名の各単語の先頭を大文字にする方法で、
	「アッパーキャメルケース」と「ローワーキャメルケース」があります。
	先頭文字を大文字にすることで単語1つ1つを明確にします。

	・アッパーキャメルケース
		アッパーキャメルケースは単語の先頭を全て大文字で記述し、
		2文字目以降を全て文字にします。
		「パスカルケース」とも呼ばれています。

			例:
				class CollisionManager
				{
				};

		パスカルケースはクラス名に対して使用されることが多いです。

	・ローワーキャメルケース
		ローワーキャメルケースは最初の単語のみ全て小文字で記述し、
		残りの単語については先頭大文字、残りは小文字で記述します。
		ローワーキャメルケースを単に「キャメルケース」と呼びます。

			例:
				int getMoney()
				{
					return money;
				}

		キャメルケースは関数に対して使用されることが多いです。

●スネークケース
	スネークケースは変数や関数名の単語間を「 _ 」でつなげて
	各単語を明確にする方式です。

		例:
			float pos_x;
			float pos_y;

●その他
	・省略
		昔のプログラムではプログラムのサイズを小さくするために
		変数名や関数名などは極力短くするようにしていました。
		例えばManager => Mgr、Position => Posなどです。
		省略は誰が見ても分かるような省略なら問題ありませんが、
		一定数が分からないというような省略は可読性が下がるので
		省略すべきではありません。
		もし、省略するのなら省略にもルールを設けるべきです。
		(母音を全て取り除くなど)

■コーディングスタイル

コーディングスタイルはインデントやifやforなどの構文での
スペースの有無などです。

●インデント
	インデントのスペースの数を決めます。
	VisualStudioではタブ1個分が基本設定されています。

●制御文
	制御文では条件式のスペースや中括弧は必ず使用するかなどを決めます。

	・スペース
		構文と括弧の間にスペースを入れるかを決めます。

		スペース無し
			if(a==b){

		スペース有り
			if (a == b) {

	・中括弧
		どんな内容でも中括弧を必ず設定するかを決めます。

		中括弧無し
			if (a == b)
				printf("同じ");
			else
				printf("違う");

		中括弧有り
			if (a == b) {
				printf("同じ");
			} else {
				printf("違う");
			}

●変数
	変数の「=」の間にスペースを入れるか、複数宣言を許可するかなどを決めます。

	・スペース
		変数宣言時に「=」や「+」「-」などの演算子の間に
		スペースを入れるかどうかを決めます。

		スペース無し
			int a=0;
			int b=10;
			a = b+10;

		スペース有り
			int a = 0;
			int b = 10;
			a = b + 10;

	・複数宣言
		変数宣言時に複数宣言を許可するかどうかを決めます。

		宣言無し
			int a = 0;
			int b = 0;
			int c = 0;

		宣言有り
			int a = 0, b = 0, c = 0;

●定数
	定数はdefineかconstのどちらを使用するかを決めます。

	・defineのみ
		#define MAX_VALUE (10)
		#define MIN_VALUE (0)

	・constのみ
		const unsigned int MAX_VALUE = 10;
		const unsigned int MIN_VALUE = 0;

●インクルードガード
	インクルードガードはpragma oneceかifndefのどちらで行うかを決めます。

	・pragma once
		#pragma once

		class Test
		{
		};

	・ifndef
		#ifndef TEST_CLASS_H_
		#define TEST_CLASS_H_

		class Test
		{
		};

		#endif

■禁止事項

禁止事項では使用してはいけない手法などを決めます。
この項目は必要な各プロジェクト毎でかなり異なるので、
いくつかの例をあげます。

●多重継承禁止
	C++ではクラスを複数継承することが可能となっていますが、
	ダイアモンド継承と呼ばれる問題が発生する可能性があるので、
	極力使用しないようされています。

●メンバのpublic指定
	クラスのメンバ変数、メンバ関数を意味もなくpublic指定することは
	カプセル化の観点から良く思われていません。
	外に情報公開をしないメンバはprivate、protected指定にして
	情報の隠蔽を行います。

●グローバル変数を作らない
	グローバル変数はどこからでも使用できる変数なので、
	数多く使用すると保守性が著しく下がります。
	なので、極力グローバル変数は宣言せずにすむように設計します。