Design di dipendenza multi oggetti di destra

4

Ho bisogno di aiuto con un progetto corretto.

Ho una classe chiamata BufferManager . Il metodo push() di questa classe legge i dati da un'origine e li invia ripetutamente a un buffer finché non rimangono più dati nell'origine.

Ci sono anche thread di consumo che leggono i dati da questo buffer, non appena arrivano nuovi dati.

C'è un'opzione per ordinare i dati prima che arrivi al buffer. Quello che faccio adesso è che BufferManager , invece di spingere i dati nel buffer, lo spinge verso un altro buffer di "ordinamento" e avvia un thread di ordinamento. SorterManager class legge i dati, li ordina in file e push() es i dati ordinati nel buffer.

Ci sarà un collo di bottiglia (io uso l'unione di ordinamento con i file) ma questo è qualcosa che non posso evitare.

Questo è un cattivo design, perché sia BufferManager che SorterManager spingono i dati in un buffer (che i consumatori leggono da). Penso che solo BufferManager dovrebbe farlo.

Come posso progettarlo?

    
posta kenny 23.12.2011 - 09:18
fonte

3 risposte

1

Molti problemi di progettazione scompaiono quando si utilizza la composizione anziché l'ereditarietà.
Per chiarezza, supponiamo che la sorgente da cui stai leggendo sia una presa.
Puoi creare un Reader astratto con il metodo read() che legge una singola stringa.
Avrà 2 sottoclassi - SocketReader e FileReader .
Aggiungi un membro dati Reader a BufferManager inizializzato in c'tor.
Per creare un 'normale' BufferManager , crea un BufferManager e passalo a un'istanza SocketReader in c'tor.
Invece di creare un SorterManager , crea un BufferManager e passalo a un'istanza FileReader in c'tor.
Il metodo push() dovrebbe essere implementato come segue:

while (!mReader.eof()) {
  String s = mReader.read();
  writeToBuffer(s);
}

Per il sommario - avrai una singola classe BufferManager che funzionerà con socket o file ordinati a seconda del Reader con cui lo si inizializza.

    
risposta data 22.02.2012 - 20:28
fonte
1

Iniziamo da ciò che abbiamo?

  • A source of list exists somewhere.
  • The items of this list should be sorted.
  • There is a destination buffer which is consumed by others.

"È un must:

  • Sort process must precede source extraction.
  • Destination buffer flush must precede sort process.
  • All work must done asynchronously.
  • But steps of process must be preserved.

Passaggi del processo:

  1. Get source list.
  2. Sort it.
  3. Write to buffer.

Passaggi di progettazione:

  1. SourceManager
  2. SortingManager
  3. BufferManager

Finalmente ecco la soluzione dal mio punto di vista:

  1. When SourceManager finishes its work; it passes list to SortingManager
  2. SortingManager sorts the list taken asynchronously.
  3. When SortingManager finishes its work; it passes sorted list it produced to BufferManager.
  4. BufferManager behaves like a data server to all other consumer threads by its buffer.

Avvertenze:

  1. Do not give two responsibilities to a single class. All monads of a program must serve for only and only one responsibility.

  2. While programming asynchronous tasks; make distinction between tasks which must not start unless another task finishes and task which starts and runs independently relying on none of other tasks.

    
risposta data 22.02.2012 - 23:46
fonte
0

La risposta al vagabondaggio segue: -)

  1. Qui sto selezionando nit, ma il tuo metodo push () dovrebbe probabilmente dividere la lettura dei dati da un'origine in un altro metodo, ovvero Seguire il Principio di Responsabilità Singola (SRP)

  2. Che tipo di buffer hai? Sono curioso visto che dichiari di avere più consumatori. Presumo che tu stia utilizzando una struttura dati java.util.concurrent (j.u.c)?

  3. A seconda della struttura dei dati del buffer, potresti essere in grado di inviare al buffer in modo ordinato (qualunque cosa sia ordinata per te)

  4. Penso che il tuo problema di progettazione derivi dal livello più alto nello stack di chiamata del metodo. Penso che tu stia cercando di modellarlo:

    BufferManager manager = new BufferManager();
    manager.getDataFromSource();
    if (sortData) {
        manager.sortData();
    }
    
    manager.push();
    

Above è decisamente un uomo di paglia, in quanto i metodi di BufferManager potrebbero essere statici (in base ai propri tratti di mutabilità) e dipende da come stai leggendo i dati (lettura in blocco o stile firehose).

Spero che questo aiuti un po '! E scuse per il non styling del blocco di codice, non è sicuro di cosa sta succedendo lì, non è possibile ottenere il solito strumento per funzionare.

    
risposta data 23.12.2011 - 12:14
fonte

Leggi altre domande sui tag