2

さまざまな言語構造を表すクラス階層があります。

Expression <- NumericLiteral
              UnaryExpression
              BinaryExpression
              IndexingExpression
              IteratedExpression
                   ...

これらのクラスのオブジェクトは、さまざまな構造チェックを実行する必要がある複雑なツリー階層を形成します。たとえば、ノードが IteratedExpression の場合、その最初の子は IndexingExpression にする必要があります。チェックに含まれるレベルが 1 つだけの場合は、Visitor パターンを使用できますが、以下の例のようにより複雑なケースでは、instanceof を使用しています。

void visit(IteratedExpression node) {
    if (!(node.getChild(0) instanceof IndexingExpression)) {
        // report error
    }
}

それは instanceof の適切な使用ですか、それとも私の設計に欠陥がありますか? 代替手段は何ですか?

いくつかの代替案が提案されたので、質問の最初の部分を強調したいと思います。

それは instanceof の適切な使用ですか、それとも私の設計に欠陥がありますか?

4

2 に答える 2

3

このような:

class Visitor {
  boolean indexingExpected;
  void startIteratedExpression() {
    indexingExpected = true;
  }
  void doIndexing() {
    indexingExpected = false;
  }
  void someOtherVisit() {
    if (indexingExpected) {
      throw IllegalStateException();
    }
  }
}
clas IteratedExpression {
  private List<Expression> children;
  public void visit(Visitor visitor) {
    visitor.startIteratedExpression();
    for(Expression child : childrenExpression) {
      child.visit(visitor);
    }
    visitor.endIteratedExpression();
  }
}
class IndexingExpression extends Expression {
  public void visit(Visitor visit) {
    visitor.doIndexing();
  }
}

Visitor を使用したい場合は、ツリーにいくつのレベルがあるかは問題ではありません。

于 2010-10-27T07:19:47.470 に答える
1

抽象メソッドを追加しExpressionて、その子に実装します。
そのため、各クラスには独自のチェックがあります。

于 2010-10-27T06:38:54.277 に答える