形式言語とオートマトン理論のコース用の教育ツールの設計と実装を試すために、暇な時間を使うことを考えています。私は、OOPの実装が適切であるかどうか、もしそうであれば、以下に概説する設計の高レベルの改善を誰かが提案できるかどうかを判断しようとしています。
言語分析で明らかになった潜在的なクラスはたくさんあります。いくつか(そして私が基本的な何かを逃したかどうか私に知らせてください)は次のとおりです:文法; 非終端記号; ターミナル; 製造; 正規文法; 文脈自由文法; 状況依存文法; 無制限文法; オートマトン; 州; シンボル; 遷移; DFA; NFA; NFA-ラムダ; DPDA; PDA; LBA; チューリングマシン。
質問1:各種類の文法は、実装で独自のクラスを取得する必要がありますか、または包括的な文法クラスには、それがどの種類の文法であるかを判別するメソッドが必要です(たとえば、「isRegular()」、「isContextFree()」など)。 。) (より一般的には、ドメインモデルで少しだけ異なり、動作の点でのみ異なるクラスは、実装の継承によって表される必要がありますか、それとも単に異なる種類の動作を親クラスにプッシュする方がよいでしょうか?)
質問2:「シンボル」、「状態」、「非終端記号」などのようなものは、実装で独自のクラスを取得する必要がありますか、それともこれらはコンテナーによって支配される必要がありますか? (より一般的には、ドメインモデルの非常に単純なクラスに、実装で独自のクラスを指定する必要があります(たとえば、拡張性のために)。それとも、コンテナークラスにプッシュする必要がありますか?)
質問3:トランジションは実装で独自のクラスである必要がありますか?その場合、各種類のオートマトンをサポートするためにサブクラス化する必要があります(状態が異なるだけでなく、何が起こるかも異なるため)移行中)? (より一般的には、1つの子と別の子の間に全単射がある2つの抽象的な親クラスを持つことは良い習慣ですか...カップリング?)
結局のところ、これらの決定の多くは単なる設計上の決定であることに気づきましたが、皆さんがOOP設計のベストプラクティスについてどのように考えているかを知りたいと思います。さらに、純粋なOOP設計の質問として「より一般的な」質問をするだけではない理由は、この種のドメイン(言語とオートマトン)の経験がある人々からの特別な視点が欲しいからです。
どんな助けでも大歓迎です。