====== 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 を使って、複数の選択肢を明確に列挙するのも有効。 ===== まとめ ===== * 「この数字、何のため?」と思ったら、**マジックナンバーかもしれない!** * 必ず意味のある「名前付き定数」に置き換えて、**読みやすく・修正しやすく・バグを減らす**コードを心がけましょう。