【Unity】Unityで学ぶデザインパターン15: Interpreter パターン【デザパタ】

# はじめに
様々な言語で「デザインパターン」の本が世の中にありますが、筆者個人の経験では
`いまいちピンとこない例` `いまいちピンとこないコード` で説明されてることが多く、
`結局これっていつ使うの？` という疑問に答えるには仕事仲間等との議論をしないと
辿り着けないことが多々ありました。

そこで特に「ゲーム開発ではどう使うか？」にフォーカスを当てて、実践的な例を交えて
デザインパターンの説明の需要があると思い記事を作りました。

## デザインパターンを学ぶ理由

デザインパターンを学ぶ理由としては
1. 車輪の再発明の防止
1. 長文で読みにくいコード（可読性の低いコード）を減らす
1. コードを疎結合にして変更に強くなる(変更時のコスト・変更箇所を減らす)
1. モジュールとして使いまわせるように、コードの再利用性を高める
といった効果を期待できます。

## 対象読者
Unity 全くの初心者(インストールしただけで触ったことがないような方)はお断りです。
最低限以下のことは理解・経験を積んでおくことが必須になります。

- MonoBehaviour 継承クラスでコードを書いたことがある
- C# のピュアクラスを用いた自作クラスを作ったことがある
- クラスの継承という概念は知っている

そのため、`脱・初心者` `中級者へのステップアップ` として `デザインパターンを学ぶ` のが良いと思います。


# デザパタ記事リンク
## 生成系
1. [AbstractFactory パターン](https://qiita.com/Cova8bitdot/items/e863cecf48c0529ba05a)
1. [Builder パターン](https://qiita.com/Cova8bitdot/items/9dcdfeb0641bc774b1f8)
1. [FactoryMethod パターン](https://qiita.com/Cova8bitdot/items/61a38fd51735f321e564)
1. [Prototype パターン](https://qiita.com/Cova8bitdot/items/0bc251bc36201985c204)
1. [Singleton パターン](https://qiita.com/Cova8bitdot/items/29b7064c7472a6f34972)

## 構造系
1. [Adapter パターン](https://qiita.com/Cova8bitdot/items/f09776957073cf64902b)
1. [Bridge パターン](https://qiita.com/Cova8bitdot/private/5b528216952c74436045)
1. [Composite パターン](https://qiita.com/Cova8bitdot/items/1c57d856027a33e99eb0)
1. [Decorator パターン](https://qiita.com/Cova8bitdot/items/e1373a756b3dfd86c920)
1. [Facade パターン](https://qiita.com/Cova8bitdot/items/bdf0976bdfa83e57f121)
1. [Flyweight パターン](https://qiita.com/Cova8bitdot/items/7f1f1f04b46ebaf43c5e)
1. [Proxy パターン](https://qiita.com/Cova8bitdot/items/77bef2e721f0be0804d2)

## 様態・ふるまい系
1. [Chain of Responsibility パターン](https://qiita.com/Cova8bitdot/items/66c62dd96adffda7e72e) 
1. [Command パターン](https://qiita.com/Cova8bitdot/items/9a88f7fc0782c729f97c)
1. [Interpreter パターン](https://qiita.com/Cova8bitdot/items/a871c1de813d14049934)(本記事)
1. [Iterator パターン](https://qiita.com/Cova8bitdot/items/302f19863cc3b2235625)
1. [Mediator パターン](https://qiita.com/Cova8bitdot/items/be33b97f35c84e814df7)
1. [Memento パターン](https://qiita.com/Cova8bitdot/items/ae7e6f5d2da7b07d379b)
1. [Observer パターン](https://qiita.com/Cova8bitdot/items/632782ad5264baf6a366)
1. [State パターン](https://qiita.com/Cova8bitdot/items/ab9fc16ac3a6657fdce0)
1. [Strategy パターン](https://qiita.com/Cova8bitdot/items/28dd773075cf6e9fefee)
1. [TemplateMethod パターン](https://qiita.com/Cova8bitdot/items/f0bed164ef6563b489d0)
1. [Visitor パターン](https://qiita.com/Cova8bitdot/items/15c56d40435adf63891d)

# Interpreter　パターンについて
Interpreterパターンは名前の通り `解説・解釈` をするのが目的なデザインパターンです。
何を解釈するのかというと、 `文字列` を `プログラム・演算処理` として解釈することである。

もう少し深掘りするといわゆる `自然言語処理` 的な `構文解析` に利用され、`文法の定義` や `表現・解釈` に利用されるデザインパターンです。

## Interpreter パターンによる設計例
Interpreter パターンは与えられた文字列を `木構造` にして解析・管理します。

例題としてスペース区切り文字列として四則演算が与えられるものを考えてみましょう。

```mermaid
classDiagram
    class IInterpreter{
        <<interface>>
        float Interpret(string context)
    }
    class CalculateNode{
        <<abstract>>
        float Interpret(string context)
    }
    IInterpreter <|-- CalculateNode

    CalculateNode <|-- Terminal
    CalculateNode <|-- NonTerminal
    NonTerminal <|-- AddOperator
    NonTerminal <|-- DubOperator
    NonTerminal <|-- MultiplyOperator
    NonTerminal <|-- DevideOperator
    NonTerminal <|-- NumberNode
```

今回は計算するのでInterpret はfloatを返します。
Terminal・Nonterminalは終端かそうでないかの違いです。Nonterminalは
非終端記号のため、四則演算の各種オペレータと数値Nodeが派生で存在します。


# ゲームにおける Interpreter
正直言うと、ゲーム分野においてはほとんど利用されません。
強いて言えば敵AIの動きを独自言語のプログラムで書いてもらって、それを動作させるための構文解析等に利用するくらいです。
(数少ないゲーム文脈でのドメイン固有言語)

文字列は柔軟性こそありますが、 `バイナリに比べ余計にメモリを使う` とか `typoを引き起こしやすい` などの
デメリットもあるため、基本的にはUI用途以外での文字列は使われることは薄いです。（UniqueなUserIDを生成するためuser id はstring にするといった使い方があるくらいでしょう）

基本的にはCommandパターンと各コマンドにIDを振ってそのIDとパラメータを共有して利用・管理するため、ゲームでInterpreterパターンを利用する場面に遭遇するのはほとんどの人が無いでしょう。

# まとめ
主に自然言語処理系で利用されるInterpreterパターンですが、ゲームにおいてはほとんど登場しないでしょう。
ただし、独自軽量言語で内部処理を書く場合とかで急に利用用途が出る場合があるため、知識としては知っておくと良いでしょう。