Windowsプログラミング入門:ウィンドウの表示方法(VS + C++ + DirectX11前段階)
(以下、既存内容は省略)
授業で使うプログラミングの命名ルール
この授業で作成するプログラムの「クラス名」「関数名」「変数名」などは、以下のルールに統一します。 プログラムの可読性・保守性を高めるため、できるだけルールに沿って記述してください。
共通ルール
- 名前はすべて 英語 にすること。
- 名前を見るだけで「何を表しているか」が分かるようにする。
※ ただし、一時的に使う変数(例:i, j, tmpなど)は例外とします。
クラス名・構造体名
- 頭文字は大文字にする。
- 単語の区切りも大文字(パスカルケース)にする。
- 基本的に「名詞」で構成する。
おすすめの補足ルール:
- クラスのメンバ変数は末尾にアンダースコア(`_`)を付ける(例:`position_`)
- クラス名には役割を明確に示す名前を使う(例:`Renderer`, `InputManager`, `EnemySpawner` など)
- 抽象的なクラスには `Base` や `Interface` などの接尾辞を使って区別する(例:`EnemyBase`, `IUpdatable`)
例:
- `Player`
- `GameObject`
- `InputManager`
- 頭文字は大文字にする。
- 単語の区切りも大文字(パスカルケース)にする。
- 基本的に「名詞」で構成する。
例:
- `Player`
- `GameObject`
- `InputManager`
関数名
- 頭文字は大文字にする。
- 単語の区切りも大文字(パスカルケース)にする。
- 基本的に 動詞(+目的語)で構成する。
例:
- `AddScore`(スコアを加算する)
- `IsButtonDown`(ボタンが押されているか)
- `SetPosition`(位置を設定する)
変数名
- 頭文字は小文字にする。
- 単語の区切りは大文字(キャメルケース)にする。
- 基本的に「名詞」で構成する。
- クラスのメンバ変数は末尾にアンダースコア(_)を付ける。
補足:なぜメンバ変数にアンダースコアを付けるのか?
クラスの中でローカル変数とメンバ変数の名前が重なると、どちらを指しているか分かりづらくなることがあります。
アンダースコアを付けることで、「これはメンバ変数です」と明確に区別できるようになります。
特にコンストラクタやセッターで、引数とメンバ変数が同じ名前になる場合にも混乱を避けられます。
例:
class Player { public: Player(int hp) { hp_ = hp; // メンバ変数と引数が区別できる } private: int hp_; };
- 頭文字は小文字にする。
- 単語の区切りは大文字(キャメルケース)にする。
- 基本的に「名詞」で構成する。
- クラスのメンバ変数は末尾にアンダースコア(_)を付ける。
例:
- `position`
- `highScore`
- `playerName_`(クラスメンバ)
定数名
- すべて大文字にする。
- 単語の区切りはアンダースコアでつなぐ。
例:
- `SCREEN_WIDTH`
- `JUMP_POWER`
- `MAX_LIFE`
ファイルスコープの変数・定数の扱い
- ファイル全体で使うグローバル変数は、無名namespace(`namespace {}`)内に定義する。
→ 外部ファイルからのアクセスを防ぎ、安全にファイル内で共有できます。
- 定数類(定数、定数配列など)もこの無名namespace内にまとめて記述します。
例:
namespace { int globalCounter = 0; const int SCREEN_WIDTH = 1280; const int SCREEN_HEIGHT = 720; }
このようにしておくことで、他のファイルと名前がぶつかるのを防ぎつつ、明確に「このファイルだけで使う」と分かる設計になります。
- すべて大文字にする。
- 単語の区切りはアンダースコアでつなぐ。
例:
- `SCREEN_WIDTH`
- `JUMP_POWER`
- `MAX_LIFE`
enum(列挙型)の命名ルール
- enumの型名は パスカルケース(先頭大文字+単語ごとに大文字)にする。
例:`GameState`, `Direction`, `InputType`
- enumの各要素(定数)は 全て大文字+アンダースコア区切り(定数と同じ形式)で統一する。
例:`STATE_TITLE`, `STATE_PLAYING`, `DIR_UP`, `DIR_DOWN`
- 必要であれば、接頭語を使ってグループ名を示すとわかりやすくなる。
例:`INPUT_KEY_A`, `INPUT_MOUSE_LEFT` など
例:
enum GameState { STATE_TITLE, STATE_PLAYING, STATE_GAMEOVER }; enum Direction { DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT };
このようにすることで、enumの項目が定数と明確に区別され、コードの読みやすさと一貫性が向上します。
enumとenum classの違い
C++では列挙型に2つの書き方があります。それぞれに特徴があります。
enum(従来の列挙型)
- 暗黙的に整数(int)として扱われます。
- 同じスコープ内で定数名が他のenumや変数と衝突しやすい。
- C言語からの互換性を重視した古い形式。
例:
enum Direction { UP, DOWN }; int dir = UP; // OK(暗黙のint)
enum class(スコープ付き列挙型)
- C++11から追加された新しい形式。
- 定数名が型にスコープされるので、名前の衝突が防げる。
- 暗黙的にintに変換されない(必要ならキャストが必要)。
例:
enum class Direction { Up, Down }; Direction dir = Direction::Up; // スコープ付きで明示的
どちらを使うべき?
- 基本的には enum class を推奨します。
→ 名前の衝突がなく、型安全で保守性が高いため。
- ただし、外部ライブラリや既存コードとの互換性が必要な場合は enum を使うこともあります。
このルールに慣れていくことで、大規模なプログラムでも読みやすく、他人と共同で開発しやすくなります。
マジックナンバーはやめてくれぃ
マジックナンバーとは?
- マジックナンバーとは、意味のわからない「ただの数字」がコードに直接書かれていることを指します。
- プログラムの中に突然「5」とか「1280」とか「3.14」などが出てきたときに、それが何の値なのか分からない状態がマジックナンバーです。
例:
if (x > 1280) { // 1280が何を意味するのか分かりづらい! }
なぜマジックナンバーがダメなのか?
- 意味が伝わらない:数字を見ただけでは意味がわからない。
- 後から変更が大変:何かを変更したいとき、どこを直せばいいか分かりづらい。
- バグの原因になりやすい:数字の意味を勘違いして使ってしまうことがある。
よくあるマジックナンバーの例と解消法
- 画面サイズの定義:
// NG if (x > 1280) { ... } // OK const int SCREEN_WIDTH = 1280; if (x > SCREEN_WIDTH) { ... }
- 配列のサイズ:
// NG for (int i = 0; i < 4; ++i) { ... } // OK const int MAX_ENEMIES = 4; for (int i = 0; i < MAX_ENEMIES; ++i) { ... }
- アニメーションのフレーム数:
// NG if (frame >= 60) { ... } // OK const int FRAME_WAIT = 60; if (frame >= FRAME_WAIT) { ... }
- 色の指定:
// NG SetColor(255, 0, 0); // 何の色? // OK const int COLOR_RED[3] = {255, 0, 0}; SetColor(COLOR_RED[0], COLOR_RED[1], COLOR_RED[2]);
- ジャンプ力や重力などゲーム特有の物理値:
// NG velocity.y += 9.8f; // OK const float GRAVITY = 9.8f; velocity.y += GRAVITY;
どう書くのが良いか?
- ファイルの上部、または無名namespace内に `const` または `constexpr` を使って名前付きの定数として宣言する。
- 値の意味が伝わる名前をつける。
- enum や enum class を使って、複数の選択肢を明確に列挙するのも有効。
まとめ
- 「この数字、何のため?」と思ったら、マジックナンバーかもしれない!
- 必ず意味のある「名前付き定数」に置き換えて、読みやすく・修正しやすく・バグを減らすコードを心がけましょう。