Skip to content

値オブジェクトの作り方

momomo546 edited this page Jul 19, 2024 · 17 revisions

ここも読むといいかも
あとここも
HPを例に話します。

using System;

public class Hp
{
    private readonly int _maxHp;
    public int maxHp { get { return _maxHp; } }
    private readonly int _currentHp;
    public int currentHp { get { return _currentHp; } }

    //引数が2個の場合のコンストラクタ
    public Hp(int maxHpValue, int currentHpValue)
    {
		
        // 0より小さい時には例外を発生させる
        if (currentHpValue < 0) {
            throw new ArgumentException("Value cannot be negative");
        }
        // maxHpを超える時には例外を発生させる
        else if (currentHpValue > this._maxHp) {
            throw new ArgumentException("Value cannot over maxHp");
        }
        this._currentHp = currentHpValue;
        this._maxHp = maxHpValue;
    }

    //引数が1個の場合、this(maxHpValue, maxHpValue)の部分で上のコンストラクタを使用し、
    //同じ値をcurrentHpとmaxHpに代入している。
    public Hp(int maxHpValue) : this(maxHpValue, maxHpValue){}

    public Hp AddCurrentHp(Hp addedHp)
    {
        if (this._currentHp + addedHp.maxHp > this._maxHp) {
            return new Hp(this._maxHp);
        }
        else {
            return new Hp(this._maxHp, this._currentHp + addedHp.maxHp);
        }
    }

    public Hp AddMaxHp(Hp addedHp)
    {
        return new Hp(this._maxHp + addedHp.maxHp);
    }

    public Hp Substract(Hp substructedHp)
    {
        if (this._currentHp - substructedHp.maxHp < 0) {
            return new Hp(this._maxHp, 0);
        }
        else {
            return new Hp(this._maxHp, this._currentHp - substructedHp.maxHp);
        }
    }
}

フィールド変数はprivate readonlyをつける

private readonlyとして一度作ったら値を変更しない!
変更したくなったときは新しいインスタンスを作る。
つまり戻り値をnew Hp(新しい値)とする。
外から値を取得するときはgetを使用しhp.maxHpで取得できる。
setは禁止!!!

private readonly int _maxHp;
public int maxHp { get { return _maxHp; } }

コンストラクタで不正な値が入ることを防ぐ

private readonly int _currentHpとしたためコンストラクタからのみ値を代入できる。

詳しくはここ
  • privateが付いているのでクラス内からしかアクセスできない。
  • readonlyが付いているので一回だけ代入できる。
  • _currentHpの前についている_は変数がprivateであるため付いている。

不正な値を防ぐためif文などで例外を投げる(インスタンス生成時にtryが必要になる)

public Hp(int maxHpValue, int currentHpValue) {
		
    // 0より小さい時には例外を発生させる
    if (currentHpValue < 0) {
        throw new ArgumentException("Value cannot be negative");
    }
    // maxHpを超える時には例外を発生させる
    else if (currentHpValue > this._maxHp) {
        throw new ArgumentException("Value cannot over maxHp");
    }
    this._currentHp = currentHpValue;
    this._maxHp = maxHpValue;
}

メソッドを作る

HpクラスにはAddメソッドとSubstractメソッドを作成した。
引数はHp型として、MpAttackといった別の値を間違えて入力することを防ぐ。
戻り値はnew Hp(新しい値)としている。

public Hp Add(Hp addedHp)
{
    if (this._currentHp + addedHp.maxHp > this._maxHp) {
        return new Hp(this._maxHp, this._maxHp);
    }
    else {
        return new Hp(this._maxHp, this._maxHp + addedHp.maxHp);
    }
}

コンストラクタのオーバーロード

オーバーロードとは、引数が異なるメソッドを同名で定義できる機能のこと
これを利用して引数が1個の場合と引数が2個の場合の動作を定義できる。
this(maxHpValue, maxHpValue)Hp(maxHpValue, maxHpValue)と同じである。
つまり引数が1個の場合、currentHpmaxHpに引数の値が代入される。

//引数が1個の場合、this(maxHpValue, maxHpValue)の部分で上のコンストラクタを使用し、
//同じ値をcurrentHpとmaxHpに代入している。
public Hp(int maxHpValue) : this(maxHpValue, maxHpValue){}
Clone this wiki locally