Progettazione di un oggetto valutatore per la propagazione e I / O dei risultati

0

Stiamo discutendo del design. Tieni presente che questo è fortran, quindi non possiamo essere troppo intelligenti. Abbiamo le seguenti classi: Applicazione, Sistema, Calcolatrice, CalcolatriceSemplice, CalcolatricePeriodica, Risultato.

L'applicazione è un oggetto applicazione che gestisce gli oggetti di sistema. Per calcolare le informazioni sull'oggetto System, l'applicazione passa il sistema a un calcolatore, che restituisce un risultato.

All'interno di Calcolatrice ci sono due classi specializzate CalculatorSimple e CalculatorComplex, che agiscono su System in base alle informazioni disponibili sul sistema stesso. Alcuni sistemi richiedono CalculatorSimple. Altri richiedono CalcolatriceComplex. La decisione avviene all'interno di Calcolatrice e l'oggetto Risultato può contenere informazioni aggiuntive se è stato eseguito CalculatorComplex. Queste informazioni aggiuntive possono essere interrogate con metodi sull'oggetto Result, per verificare se l'informazione è presente o meno. Questa informazione è di piccole dimensioni.

Per mantenere la separazione dei ruoli, voglio mantenere questa parte inconsapevole dell'output di input. L'oggetto risultato viene ricevuto dall'applicazione e quindi l'applicazione ha il ruolo di scrivere i dati nel file, in base a ciò che trova nell'oggetto risultato. Un collega invece propone di passare il file all'oggetto Calcolatrice e farlo filtrare attraverso la catena in modo tale che le cose vengano scritte direttamente sul file.

Il punto aggiuntivo è che dobbiamo avere un solo file di output, quindi quando il programma viene eseguito in parallelo, solo il nodo master deve scrivere sul file di output, che viene identificato tramite un percorso assoluto e a causa di una limitazione del nostro grezzo Non è possibile accedere a IO lib da processi slave MPI.

Abbiamo bisogno di un'opinione indipendente. Cosa faresti?

Modifica : grazie. Ho diffuso voti e premi il più possibile, poiché chiaramente non c'è una risposta corretta, solo una serie di feedback.

    
posta Stefano Borini 10.05.2011 - 14:05
fonte

4 risposte

2

In secondo luogo, l'opinione di Kerri: il tentativo di passare l'oggetto I / O in giro causerà solo problemi con SRP del sistema e ostacolerà l'estendibilità del codice in futuro. Se esci dalla logica, puoi persino gestire scenari come l'output su più file / posizioni costruendo un pattern di osservatore attorno a questo. (In realtà mi piace ancora questa opzione se riesci a vedere una crescita nel prossimo futuro - in questo modo sei totalmente disgiunto).
Per quanto riguarda le restrizioni su un solo file di output (presumo che tu voglia dire che non vuoi le scritture concorrenti), questo dovrebbe essere limitato nell'oggetto che incapsula il File. Se intendevi che vuoi che tutti i processi scrivano su un solo file, di nuovo puoi usare un sistema simile con la gestione della concorrenza comodamente in questo wrapper di oggetti File.

    
risposta data 17.05.2011 - 17:58
fonte
5

Preferisco la soluzione, quella di restituire il risultato all'Applicazione e lasciare che gestisca l'I / O del file. Questo disaccoppia la calcolatrice da qualsiasi I / O di file, il che significa che potresti teoricamente usarlo in situazioni in cui non dovresti scrivere su un file, ad esempio, ma aggiornando la GUI o qualcos'altro. Se possibile, la mia opinione è di rimanere il più possibile disaccoppiato, accoppiando solo quando necessario.

Ma questa è la mia opinione, e non ho scritto una parola di Fortran nella mia vita. Ho fatto un sacco di altri OOP, però, e, in generale, farei ciò che ti ho già detto.

    
risposta data 13.05.2011 - 06:17
fonte
1

Restituire i risultati all'applicazione renderebbe questo codice molto più gestibile rispetto al passaggio del file. Il calcolo è indipendente da ciò che viene effettivamente fatto con il risultato e il tuo codice dovrebbe riflettere questo. Scrivere su un file è fondamentalmente una traduzione, io lo astraggo in un oggetto file e lasciare che l'oggetto Application abbia la sola responsabilità di orchestrare semplicemente tra gli oggetti correlati. Questo avrà l'ulteriore vantaggio di darti un posto unico in cui cercare problemi quando la scrittura dei file non produce i risultati corretti. Non sto dicendo che dovresti mettere la determinazione di chi dovrebbe scrivere sul file in questo nuovo oggetto, solo il codice che traduce l'oggetto risultato nei dati scritti nel file. Dipenderebbe davvero da ulteriori dettagli sul sistema per determinare come gestire il problema del singolo file writer.

    
risposta data 17.05.2011 - 21:18
fonte
1

Bene, se vuoi salvare la seconda metà della propagazione (dalla Calcolatrice all'applicazione), il Calcolatore potrebbe aspettarsi una sorta di Output astratto a cui può scrivere, che implementa come ti serve.

L'implementazione dell'output sarà responsabile dell'effettiva produzione (stampa su schermo, scrittura su file, gestione della concorrenza ecc.), l'applicazione collegherà il calcolatore con una tale implementazione e il calcolatore calcolerà e passerà il suo risultato a detto Output.

    
risposta data 17.05.2011 - 21:48
fonte

Leggi altre domande sui tag