【デザインパターン】Interpreterパターンをクラス図で理解する

デザインパターン

Interpreterパターン

Interpreterパターンは、ある構文解析の規則をクラスで表現するデザインパターン。
1つのクラスで1つの解析規則を作成し、解析結果を次のクラスの解析に渡す。複数クラスを使って文字列の構文解析を行い、その結果を返す、というふうに実装する。
自分なりにInterpreterパターンをクラス図にまとめてみました。

Interpreterパターンのクラス図

Interpreterパターンのクラス図

Interpreterパターンのクラス図

Interpreterパターンの解説

ある文字列を構文解析するとき、1文字ずつ解析していき、ある文字に対してはどのような処理を行うか、を定義していくのがExpression1,2のinterpretメソッドになる。そして、Expression1,2のインターフェースをExpressionインターフェースで定義しておく。各interpretメソッドでは、構文解析途中の内容をContextクラスにまとめ、次のinterpretメソッドの引数に渡すことで、解析を進めていく。

Parserクラスでは与えられた解析対象の文字列を分解し、解析が必要な順番に応じてExpressionを用意し、属性expressionsに格納しておく。parseメソッドではこのexpressionsを順番に用いて解析を行い、全て解析が終わったら結果を返す。

Interpreterパターンをどういう場合に使うか

自分自身は実装した経験はないが、SQLや正規表現などがInterpreterパターンだそうである。
開発するアプリケーションになにかしらの構文ルールを設けた入力を行い、その内容を構文解析して処理を実行するような場合に、Interpreterパターンを用いることができる。

PlantUMLでInterpreterパターンのクラス図を記述する

Interpreterパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Interpreter
class Parser{
  + expressions : Expression[]
  + parse() : String //expressionsを用いて解析し、結果を返す(Stringは一例)
}
class Context{
}
interface Expression{
  + interpret(Context) : void
}
class Expression1 implements Expression{
  + interpret(Context) : void
}
class Expression2 implements Expression{
  + interpret(Context) : void
}

Parser o--> Expression
Expression1 --> Context
Expression2 --> Context
@enduml

参考サイトURL

Interpreter パターン – Wikipedia
PHPによるデザインパターン入門 – Interpreter〜言語の文法表現を通訳する – Do You PHP はてブロ
Interpreter パターン (文法規則をクラスで表現したものを用い構文解析し, その結果に基づき処理を実行していく機能を提供する) — WTOPIA v1.0 documentation