2009-06-11 22 views
1

複合構造の設計に関連する問題があります。私は一般的な数学的表現を記述するExpression抽象クラスを持っています。その考え方は、式が原子表現(「x」や「3」など)や原子表現の集約(集計、プロダクト、累乗など)になりうるということです。これはコンポジットパターンによってよく記述されることが分かります。例えば、SummatoryクラスはOperationTermから継承し、Expressionクラスから継承し、Expression用語のリスト "augends"を含んでいます。複合構造の継承

これらの表現の一部をいくつかのプロパティのベースに特化しようとするまでは、すべて問題ありません。たとえば、ExpressionがMonomial TermのSummatoryで構成されている場合、クライアントコードに対して透過的な方法である種の演算(積分や微分など)を最適化するには、Polynomialとして「ラベル付け」する必要があります(Expressionオブジェクトのみを処理する必要があります)。

誰も私がこの種の構造をどのように設計できるかについてアイデアを持っています(おそらく拡張性のある方法で)?

答えて

0

私はあなたが間違った方法をしていると思います。

実際のデータ構造にどのような入力をしても、その変換が簡単で簡単になるようにしてください。

多項式のようなものは、あとで追加したり、元々作成した汎用構造体に後でタグ付けすることができます。

この種のデザインパターンは、コンピュータ言語と自然言語の両方のコンパイラ/インタプリタで多く発生します。基本的には、最初のステップは構文解析で、構文構造を構築します。構文木次に、構文に意味が付いた意味解析が行われます。あなたの記述的な言葉で判断すると、おそらく数式のための通訳を実装しているので、これは非常に近い一致になります。

データ構造/言語インタプリタ/コンパイラに関するAho HopcroftとUllmanの書籍、いくつかの最新のシンプルなコンパイラの例など、それらのdc(デスク電卓)の例については、KernighanとPikeをご覧ください。これらはデザインパターンの豊富なソースです(ただし、彼らはその言葉の人気を前にしていますが)。

0

表現が不変で、作成後に書き込まれない場合、特殊なクラスのインスタンスを作成することができます(詳細をクライアントコードから削除したい場合は、Factoryパターンを使用します)。彼らが慣れていない場合は、State patternを使用して、表現のさまざまな状態として話す "ラベル"だけを扱います。

1

できません。別の特殊な式を使いたいので、式のタイプをサブクラス化する必要があります。

通常、そのような抽象構文木を構築するために使用できる型を定義するときは、Visitorおよび/またはクライアントコードが複合式をルートからブラウズ/変更するために使用できる修飾子を提供します。

新しい複合式ツリーの構築に関しては、クライアントコードがどのような式を組み立てようとしているかを知っているので、問題はありません。

0
CompositeExpressionExpressionに由来する場合

、およびPolynomialはその後Polynomialもあり、CompositeExpressionから派生しExpression(あなたが言ったように、クライアントコードに対して透過的)。