まいにち、いっぽ

物事を理解するための出力装置

C++ から Unity+C# に移行して変化した事 定数と変数

ページ概要

Unity で他の人のコードを見た際に、私自身のコードが変化している事に気づきました。 気づいた内容をまとめていきます。

書き始めると細々も気になる点が出てきたため、変数に関係する部分のみを取り上げています(^ω^;)

定数定義の変化

C++ 時代は以下の通りです。

// 定数定義
#define _DEBUG_
// enum を使った定義
enum DIR
{
    DIR_LEFT  = 0,
    DIR_RIGHT,

    DIR_DEFAULT = DIR_LEFT,
};

C#だと以下のように変わりました。

// 文字列の定義
public classs SystemData
{
    public const string SaveKey= "TitleName_01234";
}
// enum 定義
public enum Dir
{
    Left,
    Right,
}

C++ では定数は全て大文字で定義していました。define の中に一杯処理を詰め込む人が多く、定数はマジックナンバーより安心できるが劇薬の可能性がありました。

そのため、定数が分かり易くないなんて信じられない、と考えていました。

C# の場合プロパティの get や set の中で色々する人がいますが、define を使った複雑なコードを書く人が減りました。 また、使う際に必ず Dir.Left のように enum の名前を書く為コードを読む際も定数に気づきやすいです。

定数の取り扱いが変化しただけで、人のコードが大幅に読みやすくなりました。

グローバル変数が消えた

チーム制作時に良く問題になったグローバル変数を使うことがほぼなくなりました。 似たような挙動を作る事は出来ますが大概は Hierarchy にオブジェクトが存在している為、「気が付いた時には中身が書き変わってる…?」といった問題が発生する確率も下がったと感じます。

メンバ変数が分かり易くなった

メンバ変数は public か SerializeField しておくことで、Unity の Inspector に表示されます。 ゲーム画面に頑張って表示させなくても inspector を見れば確認できるので、動作の確認がしやすくなりました。

[SerializeField]
int m_Count;

見えるメンバ変数を大量に用意されると inspector が見づらくなりますが この場合はメンバ変数が大量になっている事が目に見えて分かる為、リファクタリングの指示を出しやすく聞き入れやすくなります。

プロパティは便利だけど要注意

変数のように取り扱え、get や set の中に色々な処理を入れる事が出来る。 get と set のアクセスレベルを書き換えれるのは便利。

アクセスレベルを気にしない場合は、 public メンバ変数と殆ど同じです。

特にプロジェクトの規模が大きい場合は不具合の原因となりやすいため、 本当にクラスの外部に公開するべきかどうかを考える必要があります。

参考にしたかった資料