ビジター パターンに基づいて、AST (抽象構文ツリー) から中間表現 (IR) への変換を定義するクラスがあります。どちらのモデルも EMF モデルであるため、ビジターは AST モデルの抽象 EMF Switch クラスを拡張します (私は Xtext を使用して AST を定義しています)。ビジターには、構築中の IR のいくつかのプライベート フィールドとしての状態があります (ローカル変数のマッピング、変換中の現在のプロシージャ、命令を追加するブロックのリストなど)。
ビジターは AST のすべての構造のメソッドを実装するため、これは caseExpressionInteger から caseStatementIf まで、合計 21 個のパブリック「ケース」メソッドになります。私は 22 個のプライベート メソッドも持っています。ヘルパーであるいくつかのメソッドを除いて、これらのほとんどは状態で動作します。
現在、コードが長くなりすぎていることがわかりました。コードをリファクタリングして、管理しやすくしたいと考えています (たとえば、クラスを小さくするなど)。私の質問は、どのようなオプションがありますか?
これが私が考えたことです:
- 複数のクラスを相互に拡張し、各クラスでビジターのいくつかのメソッドの実装を追加します。
- いくつかの独立したクラスと、これらのクラスに委譲する「メイン」クラスを持ち、別のクラスで状態を渡します
- 2 つのアプローチを混在させる (一部のデリゲート、一部の継承)
別の方法が見えますか?何が一番良いと思いますか (実装/保守が簡単)? 「訪問者」が非常に一般的なパターンであることを考えると、これは多くの人が抱えていたに違いない問題だと思います。