🤔

個人的プログラミング教訓

2023/01/26に公開

気が向いたら足していきます。

定数クラスを用意しない

コード内に生数値を書く、所謂マジックナンバーは良く無い的なことはプログラム初心者の頃よく聞いたんですけど、値は状況に応じて適切に見える範囲を区切っていくべきだと思います。

例えば以下のようなコードがあったとします。

public static class Constants
{
    public const string PlayerHpPlayerPrefsKey = "PLAYER_HP";
}

これだけを見て、PlayerHpPlayerPrefsKey を正しく使える保証が無いです。というか不親切ですよね、実際の使用箇所へ飛んで、実はこいつがプレフィックスでキャラクターIDをお尻につけないといけないキーかもしれないわけです。

なのでこれはこう。

public static class MyPlayerPrefs
{   
    public static void SetPlayerPrefsHp(int characterId, int hp) =>
        PlayerPrefs.SetInt(BuildKey(characterId), hp);
	
    public static int GetPlayerPrefsHp(int characterId) =>
        PlayerPrefs.GetInt(BuildKey(characterId));
	
    private static string BuildKey(int characterId) => $"PLAYER_HP_{characterId}";
}

PLAYER_HPを書き換えられても困るわけですからメソッドに分離して直書きします。値を取得したりするところ込みで全部実装して内包してあげると親切ですね。実装者がプレイヤーHPを書き換えるときは、使用箇所には MyPlayerPrefs.GetPlayerPrefsHp(characterId) とか書いているので、あまり脳のリソースを使わずに実装ができると思います(まあ一回くらいは内容読むと思いますが)。

逆に、PLAYER_HPを複数個所で使いたい場合とかがあれば(PlayerPrefsを例えばシリアライズしたくてキーが欲しい場合とか)それは外部クラスに置くべきですが、可能であれば例えばasmdefとかを使用してinternalにしてアクセス範囲を狭めたいですね。

Discussion