Ho una sorta di AST definito in XML che sto cercando di analizzare e valutare. L'albero XML contiene i token e tutte le informazioni di cui ho bisogno. Tuttavia, trovo difficile farlo "correttamente". Ecco cosa ho:
<node type="operation">
<value name="OP">AND</value>
<value name="A">
<node type="comparison">
<value name="OP">EQ</value>
<value name="A">1</value>
<value name="B">1</value>
</node>
</value>
<value name="B">
<node type="comparison">
<value name="OP">EQ</value>
<value name="A">2</value>
<value name="B">2</value>
</node>
</value>
</node>
def getNode() {
switch (xmlNode[type]) {
case 'operation':
new OperationNode(xmlNode[value.OP], getNode(xmlNode[value.A]), getNode(xmlNode[value.B]))
case 'comparison':
new ComparisonNode(xmlNode[value.OP], xmlNode[value.A], xmlNode[value.B])
}
}
nodes = getNode(xmlTree)
nodes.evaluate()
Questo è uno pseudo-codice, ma puoi farti un'idea di quello che sto facendo. Fondamentalmente, passo in modo ricorsivo in ogni elemento del nodo dell'XML, scopri cosa è basato sul mio switch-case e poi creo l'oggetto corretto nel mio dominio, così posso valutare tutti i nodi in un secondo momento.
Ma ho alcune domande:
- Come posso liberarmi dell'interruttore? Sembra molto sporco per me, ma non riesco a pensare ad una soluzione migliore
- Come posso valutare tutti i nodi con eleganza? In questo momento, tutti i nodi ereditano da una classe base
Node
, che ha un metodoeval()
, che per polimorfismo, ho terminato con tutti i diversi comportamenti tra condizioni e operazioni. - Esiste un modo più efficiente di attraversare questo XML?