Stateパターン

      2018/06/15

Stateパターンは状態を表現する際に用いることが多く、多態性(ポリモーフィズム(Polymorphism))と言います。
多態性はオブジェクト指向言語でコーディングする上で非常に便利な設計手法です。

状態を管理するのに、良く見かける方法がこちら。
下記サンプルソースでは職業を状態として用いてます。
※値をemunなどで定義していない、などはここでは無視して下さい。

多態性使用前

private int _job = 0;

public string GetJobString() {
    switch (_job) {
        case 0:
            return "無職";
        case 1:
            return "魔法使い";
        case 2:
            return "僧侶";
        case 3:
            return "賢者";
        default:
            // Error.
            break;
    }
    return String.Empty;
}

public void NextJob() {
    switch (_job) {
        case 0:
            _job = 1;
            break;
        case 1:
            _job = 2;
            break;
        case 2:
            _job = 3;
            break;
        case 3:
            _job = 0;
            break;
        default:
            // Error.
            break;
    }
}

この場合、メソッドで状態(職業)毎の処理が増えるほど、条件文を記述しなければなりません。
ここで登場するのが、多態性です。
割とポピュラーなのですが、技術者のレベルが低い環境だと前述の様な条件分岐ばかりなんですよね。

多態性使用後

ベース状態クラス

class JobBase
{
    public virtual string GetJobString() {
        return "無職";
    }

    public virtual JobBase ToNext() {
        return new Wizard();
    }
}

各状態クラス

class Wizard : JobBase
{
    public override string GetJobString() {
        return "魔法使い";
    }

    public override JobBase ToNext() {
        return new Priest();
    }
}
class Priest : JobBase
{
    public override string GetJobString() {
        return "僧侶";
    }

    public override JobBase ToNext() {
        return new Sage();
    }
}
class Sage : JobBase
{
    public override string GetJobString() {
        return "賢者";
    }

    public override JobBase ToNext() {
        return new JobBase();
    }
}

使用クラス

private JobBase _job = new JobBase();

public string GetJobString() {
    return _job.GetJobString();
}

public void NextJob() {
    _job = _job.ToNext();
}

多態性使用後では使用クラスがスッキリとした記述になりました!

「でも、各状態クラスを沢山書かないと駄目だし、結局面倒じゃん…」

って思われるかもしれません。
しかし、各状態クラスでは自分の処理だけ書けばいいので、実装もシンプルですし、単体試験が大幅に減るので最終的な工数はグっと減ります。
また、1ファイルあたりや1メソッドあたりのライン数を減らせるため、可読性も上がります。
更に言えば、状態毎に担当者を割り振ることも容易になります。
後から状態を追加するのも簡単です。

 - 設計 ,