ソフトウェア設計において、構造体をどのような方針で採用すべきか。設計の成否を分ける判断基準を提示します。
構造体の採用が最適なケース
- 値オブジェクト(Value Object):2次元・3次元座標(X, Y, Z)、RGBカラー値、日付・時刻データなど、それ自体が固有の振る舞いを持たず、値の組み合わせそのものに意味がある場合。
- C言語/OSネイティブAPIとの連携(FFI):低レイヤーのシステムコールやハードウェア制御レジスタをマッピングする場合。
- メモリ局所性(Cache Locality)の最大化:ゲームエンジンや高速データ処理で、連続したメモリアドレスにデータを密に並べてCPUキャッシュヒット率を上げたい場合。
クラスやより高度な抽象化を選ぶべきケース
- 不正な状態を防ぐ厳密なバリデーションが必要な場合:メンバ変数が勝手に書き換えられるとシステム全体が破綻するため、プライベート変数とゲッター/セッターによるカプセル化が必要な設計。
- 状態遷移と振る舞いが密結合している場合:ユーザーアカウントの権限管理や決済トランザクションなど、メソッド経由でのみ状態を変更させたいドメインモデル。