Progettazione della gestione dello stato per un modulo di elaborazione file

5

Lo sfondo

Una delle funzionalità di un prodotto al momento in cui sto lavorando è quella di elaborare una serie di file compressi (contenenti file XML) che saranno resi disponibili in una posizione fissa periodicamente (local o location remota - non ha molta importanza per ora) e scaricare il contenuto di ogni file XML in un database. Mi sono occupato della progettazione di un modulo di analisi generico che dovrebbe essere in grado di supportare l'analisi di qualsiasi tipo di file, come ho spiegato nella mia domanda collegata di seguito. Non è necessario dare un'occhiata al seguente link per rispondere alla mia domanda, ma fornirebbe sicuramente un contesto migliore per il problema

Progettazione di parser di file generici in Java usando il modello di strategia

L'obiettivo

Voglio essere in grado di tenere traccia dello stato di ogni file XML e lo stato di ogni file compresso contenente i file XML. Probabilmente potrei avere diversi stati definiti per i file XML come NEW, PROCESSING, LOADING, COMPLETE o FAILED. Posso ricavare lo stato di un file compresso basato sullo stato dei file XML all'interno del file compresso. ad esempio, lo stato del file compresso è COMPLETATO se nessun file XML all'interno del file compresso si trova in uno stato FAILED o lo stato del file compresso non è RIUSCITO se lo stato di almeno un file XML all'interno del file compresso è FALLITO.

Una possibile soluzione

Il modello

Devo mantenere lo stato di ciascun file XML e del file compresso. Dovrò definire alcuni POJO per contenere le informazioni su un file XML come mostrato di seguito. Si noti che non è necessario memorizzare lo stato di un file compresso poiché lo stato di un file compresso può essere derivato dallo stato dei suoi file XML.

public class FileInformation {

    private String compressedFileName;
    private String xmlFileName;
    private long lastModifiedDate;
    private int status;

    public FileInformation(final String compressedFileName,
            final String xmlFileName, final long lastModified, final int status) {
        this.compressedFileName = compressedFileName;
        this.xmlFileName = xmlFileName;
        this.lastModifiedDate = lastModified;
        this.status = status;
    }
}

Posso quindi avere una classe denominata StatusManager che aggrega una mappa di istanze di FileInformation e mi fornisce lo stato di un determinato file in qualsiasi momento della durata dell'applicativo, come mostrato di seguito:

public class StatusManager {    
    private Map<String,FileInformation> processingMap = new HashMap<String,FileInformation>();  

    public void add(FileInformation fileInformation) {
        fileInformation.setStatus(0); // 0 will indicates that the file is in NEW state. 1 will indicate that the file is in process and so on..
        processingMap.put(fileInformation.getXmlFileName(),fileInformation);
    }

    public void update(String filename,int status) {        
        FileInformation fileInformation = processingMap.get(filename);
        fileInformation.setStatus(status);
    }   

}

Che si prende cura del modello per motivi di spiegazione.

Quindi qual è la mia domanda?

Modificato dopo i commenti di Loki e la risposta di Eric: -

Vorrei sapere se ci sono schemi di progettazione esistenti a cui posso fare riferimento mentre creo un disegno. Mi piacerebbe anche sapere come dovrei andare a progettare le classi di gestione dello stato.

Sono più interessato a capire come modellare le classi di gestione dello stato. Non sono interessato al modo in cui altri componenti verranno aggiornati su un cambiamento di stato al momento, come suggerito da Eric.

    
posta CKing 26.02.2013 - 15:22
fonte

1 risposta

1

Il pattern State è usato per definire il comportamento di un oggetto in base al suo stato attuale, che non è proprio adatto a questo problema se leggo correttamente la tua domanda (anche se ho capito l'istinto di guardare a quel modello). Funzionerebbe se tu avessi il codice che era qualcosa tipo:

if (status.equals("COMPLETED"))
{
    doSomethingForCompleted();
}
else if (status.equals("FAILED"))
{
    doSomethingForFailure();
}
// You get the idea...

Dato il modo in cui il tuo esempio è impostato, penso che vorresti una combinazione del pattern Observer come suggerito da gnat, e il Modello di mediatore , che stai già facendo con lo StatusManager. StatusManager può notificare il tuo codice con il nuovo set di stati dopo le chiamate add () o update ().

    
risposta data 26.02.2013 - 16:15
fonte

Leggi altre domande sui tag