プロパティとメソッドの選択

一般に、メソッドはアクションを表し、プロパティはデータを表します。プロパティはフィールドのように使用されます。つまり、プロパティは計算上複雑であったり、副作用が発生したりしないようにする必要があります。次のガイドラインに違反しない場合は、メソッドではなくプロパティの使用を検討してください。経験の浅い開発者は、プロパティの方が使いやすいと考えるからです。

プロパティを使用するケース

  • 型が論理属性(bool)を表す場合は、プロパティの使用を検討してください。
  • プロパティの値がプロセスメモリに格納され、プロパティが値へのアクセスのみを提供する場合は、メソッドではなくプロパティを使用してください。

次のサンプルはメソッドですが、プロパティにすべきです。

private int hp;
private int mp;

public int GetHp()
{
    return hp;
}

public void SetHp(int value)
{
    hp = value;
}

public int GetMp()
{
    return mp;
}
public void SetMp(int value)
{
    mp = value;
}
private int hp;
private int mp;

public void SetHp(int hp)
{
    this.hp = hp;
}

public void SetMp(int mp)
{
    this.mp = mp;
}

プロパティに変えた例)自動プロパティ(C#6からこのように省略可能)

class Player
{
    private int hp;
    private int mp;

    public int Hp { get => hp; set => hp = value; }
    public int Mp { get => mp; set => mp = value; }
}

例)プロパティ(旧形式)

class Player
{
    private int hp;
    private int mp;

    public int Hp
    {
        get
        {
            return hp;
        }

        set
        {
            hp = value;
        }
    }
    public int Mp
    {
        get
        {
            return mp;
        }

        set
        {
            mp = value;
        }
    }
}

メソッドを使用するケース

  • プロパティはフィールドよりも桁違いに低速です。スレッドのブロックを回避するために非同期バージョンの操作を提供することを検討している場合でも、プロパティとは遅すぎる可能性があります。特に、ネットワークやファイルシステムにアクセスする操作(初期化のために1回以外)は、プロパティではなくメソッドにすべきです。
  • 変換を提供するもの。次のサンプルは、キロメートルをメートルに変換するメソッドです。
public int KiloMeterToMeter(int meter)
{
    return meter * 1000;
}
  • 引数が変更されない場合でも、呼び出されるたびに異なる結果を返す場合(副作用がある場合)。たとえば、次のような場合
int hpCount;

public  int Count()
{
    return hpCount++;
}
  • クラスの外から直接アクセスする必要がある場合。。プライベートフィールド(内部キャッシュへのデータの格納)は、直接アクセスできません。
  • 配列を返したい場合
int[] hpCount;

public int[] Count()
{
    return hpCount;
}

C#

Posted by hidepon