ハンガリアン記法とUnityインスペクタの関係

Oculus IntegrationのScriptのメンバ変数でハンガリアン記法「m_」が頻繁に使われていて,
とても気になった.そこで今更発見したことがあったのでメモ.

ハンガリアン記法とは

ハンガリアン記法 - Wikipedia

プログラマがプログラムのソースコードを書く際に変数名やクラス名などの識別子に特別な接頭文字ないし接尾文字をつけることで、他の人がその識別子を見たときに識別子の使用方法・データ型情報・スコープなどが分かるようにするための命名法である。

なぜ気になったのか.

例えば,OVRGraber.csのソースコードを見てみるとメンバー変数がこんな感じで記述されてます.

    public float grabBegin = 0.55f;
    public float grabEnd = 0.35f;

    bool alreadyUpdated = false;

    [SerializeField]
    protected bool m_parentHeldObject = false;

    [SerializeField]
    protected bool m_moveHandPosition = false;

    [SerializeField]
    protected Transform m_gripTransform = null;
    [SerializeField]
    protected Collider[] m_grabVolumes = null;


    [SerializeField]
    protected OVRInput.Controller m_controller;

    [SerializeField]
    protected Transform m_parentTransform;

    [SerializeField]
    protected GameObject m_player;

自分ハンガリアン記法苦手なんですよね.
でも何故かOculus Integrationのソースコードでよく見かけるので複雑.

Unityにおける命名規則

Unityの命名規則とエディター設定 - tanaka's Programming Memo

上の記事によれば,

  • ハンガリアン記法は使わない
  • 接頭語(, m, s_, etc)は使わない
  • ローカルとメンバ変数を判断するときは"this"を使う
  • メンバ変数にはキャメルケースを使う(e.g myData)
  • パラメータにはキャメルケースを使う
  • ローカル変数にはキャメルケースを使う
  • 関数、プロパティ、イベント、クラス名にはパスカルケースを使う(e.g MyData)
  • インタフェースの名前は"I"から始める
  • enums, classes, delegatesの先頭は文字で修飾しない

とのことですので,ハンガリアン記法を使っているのはなんかうーんというお気持ち.

ハンガリアン記法とUnityインスペクタの関係

よくよくOVRGrabberのインスペクタを見てみると…,

f:id:xrdnk:20200325213242p:plain

SerializeFieldなハンガリアンメンバ変数の「m_」が外れた状態で表示されている…ぶるぶる…
m_parentHeldObject → Parent Held Object とか.

Unityの機能にあったらしい.
ObjectNames-NicifyVariableName - Unity スクリプトリファレンス

これは知らなかった.SerializeField変数には「m_」とつける習慣があるのだろうか?
うーん….しかしボクは使わないかな.いい感じの変数名を考えるのもプログラミングの楽しさの一つ!