Specializzazione template di classe per l'implementazione di Automata

1

Sto implementando le classi per simulare e generare diversi tipi di automi. Preferirei utilizzare le stesse classi di stato e transizione per tutti gli automi: NFA, DFA, PDA, ecc.

Per un PDA una transizione da uno stato ad un altro richiede una specie di estensione, perché la transizione richiede di estrarre qualcosa e inviare qualcosa sullo stack.

Quindi mi è venuta l'idea di consentire alle transizioni di accettare una classe di estensione come parametro template:

public class Transition<T> {

    private State target;
    private T extension;

    public Transition(State target, T extension) {
        this.target = target;
        this.extension = extension;
    }

    public State getTarget() {
        return target;
    }

    public T getExtension() {
        return extension;
    }
}

Tieni presente che ci sono% derivate daEpsilonTransition e RegularTransition da questa classe base.

Un PDA richiederebbe ad esempio questa estensione:

public class StackExtension {

    private Character toPop, toPush;

    public StackExtension(Character toPop, Character topush) {
        this.toPop = toPop;
        this.toPush = topush;
    }

    public Character getToPop() {
        return toPop;
    }

    public Character getToPush() {
        return toPush;
    }
}

In modo che la classe PDA possa utilizzare% istanze diTransition<StackExtension>.

Sebbene questa sia una soluzione per il mio problema, sembra un cattivo design. Soprattutto per NFA e DFA, che non richiedono alcuna estensione.

Esiste un altro modello di progettazione per il mio particolare problema?

    
posta Tim 02.10.2014 - 15:36
fonte

2 risposte

1

Non ho familiarità con le particolari classi di automati che hai menzionato, ma ogni volta che hai una classe unica che vorresti gestire in modo simile alle altre classi, allora Facade pattern è piuttosto utile.

Sto semplificando eccessivamente, ma il pattern di facciata è poco più di un wrapper attorno alla classe per uno o entrambi:

  • riduce la complessità dei metodi di classe disponibili
  • rende la classe conforme ad una particolare interfaccia

Nel tuo caso, sembra che tu stia avvolgendo la classe PDA in modo che sia conforme a un particolare insieme di interfacce. È perfetto per la facciata.

    
risposta data 30.10.2014 - 16:08
fonte
0

Tutto il codice che hai mostrato non fa nulla, semplicemente imposta le proprietà, quindi qualsiasi risposta comporterà delle ipotesi.

Non mi è chiaro il motivo per cui avere un tipo generico non vincolato sulla transizione ha un senso. Potrebbe prendere un tipo di stringa? La mia ipotesi è che quello che stai cercando di fare è lasciare che la classe "extension" sappia che la transizione è avvenuta, e forse qualche informazione a riguardo.

Sembra un po 'come se la transizione dovesse emettere un evento TransitionComplete - eccetto che gli eventi possono essere sottoscritti da qualsiasi classe, rendendo difficile per qualcuno che legge il codice sapere dove l'evento è effettivamente consumato.

Nel tuo caso, potrebbe essere più trasparente se hai passato la tua classe di estensione al costruttore della classe di transizione, di tipo ITransitionHandler, e hai chiamato il suo metodo TransitionComplete.

Non posso dire quale sia il migliore per il tuo programma.

È possibile seguire uno dei miei suggerimenti e rendere ancora generica la classe Transition, solo vincolata a ITransitionHandler. Ma perché? L'unica classe che tiene veramente al tipo della classe di estensione è la classe di estensione stessa, e lo sa già. Quindi, perché rendere quella parte del tipo di transizione?

Ancora una volta, senza vedere la tua implementazione, potrebbe non essere vero e rendere generosa l'estensione generica.

Per inciso, non impiegherei molto tempo a perfezionare il design. Il numero di tipi di automi non crescerà molto velocemente e la quantità di codice con visibilità nei dettagli di questo design è probabilmente piuttosto ridotta.

    
risposta data 30.10.2014 - 17:57
fonte

Leggi altre domande sui tag