1. パターンの意図
インタプリタ(Interpreter)パターン は、
特定の言語(ルールや文法)を表現し、それを解釈・実行する仕組みを提供する デザインパターンです。
解決する問題
- 独自のミニ言語やルールを実装したい
- 文法規則をオブジェクト化し、式を解釈・評価したい
- 正規表現や DSL(ドメイン固有言語)のように、式を読み取り実行する必要がある
ポイント
- AbstractExpression:式を表すインターフェース
- TerminalExpression:終端記号(数値や変数など)
- NonTerminalExpression:非終端記号(演算子や文法ルール)
- Context:解釈に必要な情報(変数の値など)
- 式を木構造として組み立て、再帰的に解釈する
2. UML 図
3. Flutter / Dart 実装例
Expression インターフェース
abstract class Expression {
int interpret();
}
TerminalExpression(数値)
class NumberExpression implements Expression {
final int number;
NumberExpression(this.number);
@override
int interpret() => number;
}
NonTerminalExpression(加算)
class AddExpression implements Expression {
final Expression left;
final Expression right;
AddExpression(this.left, this.right);
@override
int interpret() => left.interpret() + right.interpret();
}
利用例
void main() {
// (5 + 10) + 20
Expression expr = AddExpression(
AddExpression(NumberExpression(5), NumberExpression(10)),
NumberExpression(20),
);
print("Result: ${expr.interpret()}"); // Result: 35
}
4. Android / Kotlin 実装例
Expression インターフェース
interface Expression {
fun interpret(): Int
}
TerminalExpression
class NumberExpression(private val number: Int) : Expression {
override fun interpret(): Int = number
}
NonTerminalExpression
class AddExpression(
private val left: Expression,
private val right: Expression
) : Expression {
override fun interpret(): Int = left.interpret() + right.interpret()
}
利用例
fun main() {
// (5 + 10) + 20
val expr: Expression = AddExpression(
AddExpression(NumberExpression(5), NumberExpression(10)),
NumberExpression(20)
)
println("Result: ${expr.interpret()}") // Result: 35
}
5. 実務ユースケース
Flutter
- 独自 DSL を構築して UI やアニメーションを表現
- フィルタ条件式の解釈(例:検索クエリ "price > 100 AND stock < 50")
- 数学表現や式の評価(GraphQL/JSONPath などの簡易解釈)
Android / Kotlin
- SQL/DSL の解釈器(Room のクエリ構築など)
- 数式やルールエンジンの評価処理
- DSL を使ったビルドスクリプト(Gradle の Kotlin DSL に近い仕組み)
6. メリット / デメリット
メリット
- 文法規則をオブジェクト化し、柔軟に拡張できる
- DSL のような表現力をコード内で実現できる
- 小規模な言語処理には有効
デメリット
- 複雑な文法を扱うとクラス数が爆発する
- パフォーマンスが低下しやすい
- 本格的な処理には パーサジェネレータ の方が適している
まとめ
- インタプリタパターンは「独自言語や文法をクラス構造で表し、解釈・評価する仕組み」
- Flutter/Android では フィルタ条件式・数式評価・DSL に活用できる
- 規模が大きい場合は ANTLR など外部ツールを使う方が現実的