Question

J'ai une hiérarchie de classes représentant différentes constructions de langage:

Expression <- NumericLiteral
              UnaryExpression
              BinaryExpression
              IndexingExpression
              IteratedExpression
                   ...

Les objets de ces classes forment des hiérarchies d'arbres complexes dont j'effectuer différents contrôles structurels, par exemple si le nœud est un IteratedExpression alors son premier enfant devrait être un IndexingExpression. Si la vérification ne porte que sur un seul niveau, je peux utiliser le modèle des visiteurs, mais dans les cas plus complexes comme dans l'exemple ci-dessous, je suis en utilisant instanceof.

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

Est-ce une bonne utilisation de instanceof ou j'ai une faille dans ma conception? Quelles sont les alternatives?

Comme il y avait des solutions de rechange proposées, je voudrais souligner la première partie de la question:

Est-ce une bonne utilisation de instanceof ou j'ai une faille dans ma conception?

Était-ce utile?

La solution

Comme ceci:

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();
  }
}

Si vous voulez utiliser des visiteurs, il n'a pas d'importance combien de niveaux que vous avez dans votre arbre.

Autres conseils

ajouter une méthode abstraite à Expression et mettre en œuvre dans ses enfants.
de sorte que chaque classe aura ses propres contrôles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top