Sto violando il Principio di Responsabilità Unica con questo mio nodo AST?

0

Stiamo costruendo un interprete per una lingua come parte dei requisiti in uno dei nostri corsi universitari. Parte del progetto prevede la scrittura di un lexer e un parser. Il parser genera un AST. Ovviamente, l'AST avrebbe nodi.

Uno dei nodi di tale AST è ArithmeticOperationNode . Questo nodo sarà un nodo contenente operazioni che implicano l'aritmetica. Il codice seguente è una versione ridotta del nodo.

package ds.ast;

import exceptions.CompilerException;
import exceptions.RuntimeException;

public class ArithmeticOperationNode extends OperationNode
{
    public ArithmeticOperationNode(String operation, Computable operator1, Computable operator2, int startingLine, int startingColumn)
    {
        super(operation, operator1, operator2, startingLine, startingColumn);
    }

    public Value compute() throws RuntimeException, CompilerException
    {
        ...
    }
}

NOTA : OperationNode implementa un'interfaccia chiamata Computable .

compute() sarà responsabile dell'esecuzione dell'operazione aritmetica tra operator1 e operator2 . operator1 e operator2 possono essere un'altra espressione aritmetica. La funzione verrà chiamata quando attraverseremo l'AST durante l'esecuzione. Ci sono molti nodi che seguono lo stesso design, cioè con una funzione compute() .

Sto violando il principio di responsabilità unica con questo? ho la sensazione che lo stia facendo.

    
posta Sean Francis N. Ballais 12.05.2018 - 14:02
fonte

2 risposte

2

Sembra che vi sia una certa confusione di responsabilità in quanto si dispone di informazioni sul livello di sintassi (operazione indicata come una stringa, riga n. ecc.) insieme all'operazione semantica. Sospetto che compute() finirà per avere un codice simile a questo (pseudocodice):

if operation=="+":
  return a + b
if operation=="-":
  return a - b
...

Qui l'interpretazione della sintassi è confusa con la semantica della valutazione. L'AST non dovrebbe realmente dipendere dalla sintassi concreta, motivo per cui è chiamato un albero di sintassi Abstract . Invece il parser potrebbe generare classi AST come AddExpression , SubstractionExpression ecc. Che conterrebbe solo l'operazione semantica in compute() ma non ha alcuna conoscenza della sintassi sottostante.

    
risposta data 12.05.2018 - 15:44
fonte
2

Sì, lo sei. Potrebbe essere a causa della tua denominazione. Chiami il tuo oggetto ArithmeticOperation, già suggerendo che faccia qualcosa. Mentre in fase di analisi è ancora solo un'espressione. Più tardi nella tua domanda usi quella parola (espressione) che è davvero la parola migliore in un contesto AST. Non sentiresti la necessità di aggiungere un metodo Compute () se la cosa fosse chiamata ArithmeticExpression.

Penso che il percorso migliore sarebbe riconoscere le espressioni piuttosto che le operazioni. Hai due tipi: Unario e binario. Come per gli operatori: operatori unari (come no) e operatori binari (e, più).

    
risposta data 12.05.2018 - 15:09
fonte

Leggi altre domande sui tag