C++定数定義はconstexpr/constで明示する|マジックナンバー排除と設計意図を読み取るレビュー技術
この記事のポイント
- なぜマジックナンバーが危険なのかを整理する
- 定数の意味をレビューで読み取る力を高める
- constexprとconstの使い分けを設計レビュー観点として理解する
定数定義はただ書き方の問題ではありません。
「この値はなぜ固定なのか? どこで決まったのか?」
これを読み取る力がレビュー品質に直結してきます。
1. なぜ定数がレビュー対象になるのか?
1-1. マジックナンバーとは?
コードに直接数字や文字列が埋め込まれている状態を指します。
if (retryCount > 3) {
// ...
}
- 3が何を意味しているのかが分かりにくい
- 同じ値が複数箇所に分散しやすい
- 変更時に意図しない影響を出しやすい
1-2. 設計意図をレビューで読み取る
- 3は仕様値か、実験値か、環境依存なのか
- 変更が前提なのか、固定されるのか
- 定数管理は集中できているのか
レビューアーはこういった背景を確認します。
1-3. 定数化は「意図の可視化」
constexpr int MaxRetryCount = 3;
- 値に意味が与えられ、コードが自己説明的になる
- 変更箇所を一元管理できる
- ドメイン知識をコードに埋め込める
2. constexpr と const の違いを整理する
2-1. constexpr:完全固定の定数
- コンパイル時に確定可能な値
- 実行時のコストゼロ
constexpr int BufferSize = 1024;
- 定数式で計算できるものに限定
2-2. const:実行時固定の定数
- 実行時に初期化され、その後変更不可
const int RetryLimit = Config::GetDefaultRetryLimit();
- 設定ファイルなど外部情報に依存する値などはこちらを使います
2-3. 比較まとめ
特性 | constexpr | const |
---|---|---|
決定タイミング | コンパイル時 | 実行時含む |
設計意図 | 完全固定 | 実行後は固定 |
パフォーマンス最適化 | 非常に高い | 状況次第 |
3. レビュー対象として登場する定数の種類
✅ グローバル定数
- APIプロトコルの定義値
- バッファサイズ
- タイムアウト値
✅ クラス内定数
- 状態管理の上限
- ドメイン制約
- 状態遷移定数
✅ 関数内定数
- 局所限定の補助定数
- 可読性のための意味付け
4. 良い実装例:意図が整理された定義
#pragma once
#include <string>
struct ApiRequestLog {
int requestId;
std::string endpoint;
std::string clientIp;
};
inline constexpr int DefaultTimeoutSeconds = 30;
inline constexpr size_t MaxRequestSize = 8192;
設計意図
- API設計でドメイン知識を明示している
- ヘッダー共有用に inline constexpr を採用
- ODR(One Definition Rule)安全性を確保している
5. 良くない実装例とレビュー訓練
ケース1:マジックナンバーの埋め込み
void HandleRequest() {
if (requestSize > 8192) {
Reject();
}
}
@Reviewerマジックナンバーが埋め込まれています。意味付けされた定数名にしてください
改善例
inline constexpr size_t MaxRequestSize = 8192;
void HandleRequest() {
if (requestSize > MaxRequestSize) {
Reject();
}
}
6. 無名namespaceでの定数宣言の誤り
NGパターン(旧来のstatic代用)
namespace {
const int DefaultTimeoutSeconds = 30;
}
@ReviewerC++11以降はinline constexprの使用が推奨されます
改善例
inline constexpr int DefaultTimeoutSeconds = 30;
7. PlantUMLで依存構造を整理
- 定数専用ヘッダーで依存を整理
- スコープ整理もレビューの重要ポイント
8. CI統制:レビュー品質を維持する仕組み
✅ clang-tidy を活用
Checks: '-*,readability-magic-numbers'
- マジックナンバー自動検出に利用
✅ PRレビュー文化を育てる
- 定数名の意味付けができているか
- マジックナンバーが残っていないか
✅ テンプレート化でミス防止
- 新規ファイル作成時に定数ヘッダーの雛形を配布
9. レビュー観点チェックリスト
観点 | 確認ポイント |
---|---|
マジックナンバー排除 | 裸の数字が残っていないか |
constexpr活用 | コンパイル時決定可能ならconstexprにしているか |
const適用 | 実行時計算はconstで固定されているか |
inline constexpr | ヘッダー共有時のODR安全性が確保されているか |
スコープ整理 | 定数管理の責任範囲が整理できているか |
無名namespace排除 | 無名namespaceで定数管理していないか |
CI統制 | 自動検出ルールがCIに組み込まれているか |
PRレビュー文化 | 意図の見える命名が徹底されているか |
10. まとめ
定数設計は、「設計意図をコードに刻む作業」 でもあります。
レビューアーは次の問いを常に確認しておくと読み取りやすくなります。
- この値はなぜ固定なのか?
- 誰が変更する責任を持つのか?
- ドメイン知識が読み取れる状態になっているか?
マジックナンバーを消すだけで終わらず、
「設計を読み取るレビュー」を意識していきたいところです。