====== Windowsプログラミング入門:ウィンドウの表示方法(VS + C++ + DirectX11前段階) ======
(以下、既存内容は省略)
====== 授業で使うプログラミングの命名ルール ======
この授業で作成するプログラムの「クラス名」「関数名」「変数名」などは、以下のルールに統一します。
プログラムの可読性・保守性を高めるため、できるだけルールに沿って記述してください。
===== 共通ルール =====
* 名前はすべて **英語** にすること。
* 名前を見るだけで「何を表しているか」が分かるようにする。
※ ただし、一時的に使う変数(例:i, j, tmpなど)は例外とします。
===== クラス名・構造体名 =====
* **頭文字は大文字**にする。
* **単語の区切りも大文字(パスカルケース)**にする。
* 基本的に「名詞」で構成する。
**おすすめの補足ルール:**
* クラスのメンバ変数は末尾にアンダースコア(`_`)を付ける(例:`position_`)
* クラス名には役割を明確に示す名前を使う(例:`Renderer`, `InputManager`, `EnemySpawner` など)
* 抽象的なクラスには `Base` や `Interface` などの接尾辞を使って区別する(例:`EnemyBase`, `IUpdatable`)
例:\\
* `Player`
* `GameObject`
* `InputManager`
* **頭文字は大文字**にする。
* **単語の区切りも大文字(パスカルケース)**にする。
* 基本的に「名詞」で構成する。
例:\\
* `Player`
* `GameObject`
* `InputManager`
===== 関数名 =====
* **頭文字は大文字**にする。
* **単語の区切りも大文字(パスカルケース)**にする。
* 基本的に **動詞(+目的語)**で構成する。
例:\\
* `AddScore`(スコアを加算する)
* `IsButtonDown`(ボタンが押されているか)
* `SetPosition`(位置を設定する)
参考資料:
[[関数名によく使われる英単語(動詞)の意味とニュアンス|https://php-archive.net/php/words-in-function-names/]]
===== 変数名 =====
* **頭文字は小文字**にする。
* **単語の区切りは大文字(キャメルケース)**にする。
* 基本的に「名詞」で構成する。
* クラスの**メンバ変数は末尾にアンダースコア(_)**を付ける。
**補足:なぜメンバ変数にアンダースコアを付けるのか?** \\
クラスの中でローカル変数とメンバ変数の名前が重なると、どちらを指しているか分かりづらくなることがあります。\\
アンダースコアを付けることで、**「これはメンバ変数です」と明確に区別**できるようになります。\\
特にコンストラクタやセッターで、引数とメンバ変数が同じ名前になる場合にも混乱を避けられます。\\
例:
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 を使って、複数の選択肢を明確に列挙するのも有効。
===== まとめ =====
* 「この数字、何のため?」と思ったら、**マジックナンバーかもしれない!**
* 必ず意味のある「名前付き定数」に置き換えて、**読みやすく・修正しやすく・バグを減らす**コードを心がけましょう。