1

複合構造の設計に関する問題があります。一般的な数式を記述する Expression 抽象クラスがあります。アイデアは、式が原子式 ("x" や "3" など) または原子式のある種の集合体 (要約、積、累乗など) である可能性があるということです。これは Composite パターンによって適切に記述されることが判明したため、たとえばクラス Summatory は OperationTerm から継承され、さらに Expression から継承され、Expression 用語のリスト「オージェンズ」が含まれます。

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

この種の構造を(おそらく拡張可能な方法で)どのように設計できるかについて、誰かが考えを持っていますか?

4

4 に答える 4

1

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

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

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

于 2009-06-11T12:46:17.373 に答える
0

から派生し、CompositeExpressionから派生している場合は、(あなたが言ったように、クライアントコードに対して透過的です)でもあります。ExpressionPolynomialCompositeExpressionPolynomialExpression

于 2009-06-11T12:47:04.563 に答える
0

式が不変である場合、つまり作成後に書き込まれることがない場合は、特殊なクラスのインスタンスを作成するだけで済みます (詳細をクライアント コードから除外したい場合は Factory パターンを使用します)。それらが不変でない場合は、State パターンを使用して、「ラベル」を式の異なる状態として扱うことができます。

于 2009-06-11T12:45:07.267 に答える
0

私はあなたが間違った方法でそれについて行っていると思います. 多項式などのラベル付けについて心配する必要はありません。

入力から実際のデータ構造への変換が単純でわかりやすいことを確認してください。

多項式のようなものは、後で追加したり、最初に作成した一般的な構造に後でタグ付けしたりできます。

この種の設計パターンは、コンピューター言語と自然言語の両方のコンパイラー/インタープリターでよく出てきます。基本的に、最初のステップは構文解析です。ここでは、構文ツリーなどの構文構造を構築します。次に、構文に意味を付加する意味分析があります。説明的な用語から判断すると、おそらく数式のインタープリターを実装しているので、これは非常によく似ています。

Kernighan と Pike の dc (卓上計算機) の例、Aho Hopcroft と Ullman のデータ構造/言語インタープリター/コンパイラーに関する書籍、最新の単純なコンパイラーの例などを参照してください。それらは用語の人気に先立っています)。

于 2009-06-11T13:18:15.190 に答える