0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【デザインパターン】インタプリタパターン解説(Flutter / Android 実例付き)

Last updated at Posted at 2025-09-11

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 など外部ツールを使う方が現実的

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?