Стоит ли избегать instanceof при работе с деревом объектов? - PullRequest
2 голосов
/ 27 октября 2010

У меня есть иерархия классов, представляющая различные языковые конструкции:

Expression <- NumericLiteral
              UnaryExpression
              BinaryExpression
              IndexingExpression
              IteratedExpression
                   ...

Объекты этих классов образуют сложные иерархии деревьев, в которых мне приходится выполнять различные структурные проверки, например, если узел является выражением IteratedExpression, то егоПервый дочерний элемент должен быть IndexingExpression.Если проверка включает только один уровень, я могу использовать шаблон Visitor, но в более сложных случаях, как в примере ниже, я использую instanceof.

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

Это правильное использование instanceof или у меня есть недостатокв моем дизайне?Какие есть альтернативы?

Поскольку были предложены некоторые альтернативы, я хотел бы подчеркнуть первую часть вопроса:

Это правильное использование instanceof или у меня есть изъянв моем дизайне?

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Как это:

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, не имеет значения, сколько уровней в вашем дереве.

1 голос
/ 27 октября 2010

добавить абстрактный метод к Expression и реализовать его в своих дочерних элементах.
, чтобы у каждого класса были свои проверки.

...