コンテンツにスキップ

Interpreter

小さなドメイン言語ルールを文法オブジェクトとして解釈し、結果を計算するパターンです。

  • クエスト条件 DSL を作りたいとき
  • 会話分岐条件をデータ化したいとき
  • Expression
  • Terminal
  • Nonterminal
  • Context

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

public interface IConditionExpression
{
bool Evaluate(PlayerContext context);
}
public sealed class LevelAtLeastExpression : IConditionExpression
{
private readonly int requiredLevel;
public LevelAtLeastExpression(int requiredLevel)
{
this.requiredLevel = requiredLevel;
}
public bool Evaluate(PlayerContext context)
{
return context.PlayerLevel >= requiredLevel;
}
}
public sealed class AndExpression : IConditionExpression
{
private readonly IConditionExpression leftExpression;
private readonly IConditionExpression rightExpression;
public AndExpression(IConditionExpression leftExpression, IConditionExpression rightExpression)
{
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
public bool Evaluate(PlayerContext context)
{
return leftExpression.Evaluate(context) && rightExpression.Evaluate(context);
}
}
  • 振る舞いを分離できるため、変更の影響範囲を小さくできます。
  • ルールの追加や差し替えを比較的安全に行えます。
  • オブジェクト数や間接呼び出しが増えると、流れを追いにくくなります。
  • 実行順序のバグはテストで固定しておく必要があります。

文法ルールを式ツリーとして解釈し、結果を計算する流れです。

Interpreter の流れ