Progettazione del programma con più set di dati, algoritmi e risultati

1

Ho una domanda riguardante il design del mio software.

Esistono quattro diversi set di dati e tre algoritmi consecutivi che operano sui set di dati e sui risultati delle precedenti esecuzioni dell'algoritmo.

Sia D1 - D4 l'insieme di set di dati, A1 - A3 l'insieme di algoritmi e R1 - R3 l'insieme di risultati dai rispettivi algoritmi.

A1 utilizza i set di dati D1, D2 e D3 e deve essere eseguito su n parametri diversi. A2 utilizza i set di dati D1 e D3 nonché R1_1 - R1_n. A3 utilizza i set di dati D1, D2 e D4 e R2.

  D1    D1    D1
  D2    D3    D2
  D3          D4

  |     |     |
  v     v     v

n*A1    A2    A3
     _     _
  |  /| |  /| |
  v /   v /   v

R1_1    R2    R3
...
R1_n

Ciascuno dei risultati R1_1 - R1_n, R2 e R3 dovrebbe avere alcune funzionalità di output.

Quindi la mia domanda è come organizzare il programma e le sue classi. Credo che vorrei creare classi separate per ciascuno dei D1 - D4, A1 - A3 e R1 - R3 e rendere gli attributi dei dati e degli oggetti risultato degli oggetti dell'algoritmo? Ci sono motivi a favore o contro la creazione di n oggetti R1_1 - R1_n invece di un oggetto R1 contenente un array di n risultati?

Le classi di dati dovrebbero includere le rispettive funzioni "readFromFile" o sarebbe meglio avere una classe di utilità globale che legge tutti i dati dal file e genera gli oggetti dati? Lo stesso vale per le funzioni di output, dovrebbero essere collocate in ciascuna delle classi di risultati o dovrebbero essere organizzate globalmente?

Cordiali saluti!

    
posta jpmath 05.09.2013 - 16:13
fonte

3 risposte

1

La risposta dipende dai dettagli che non sono menzionati nella domanda.

Dipenderà dai dettagli esatti di D1, D2, ..., A1, A2. Tale dettaglio potrebbe non valere la pena di essere menzionato nella tua domanda, perché renderà la domanda troppo localizzata, e pochi leggeranno tutti i dettagli. Può ancora aiutare a ottenere una risposta più personalizzata.

Se trovi la mia risposta troppo semplicistica, dovresti aggiungere ulteriori dettagli alla tua domanda.

Quanto codice può essere condiviso tra ogni tipo di gestore dati?

Dipende da quanto common esiste tra ogni tipo di dati. Per comunanza intendo la somiglianza nella struttura o sottostruttura.

Ad esempio, dato che

  • Ogni PersonContactInfo contiene uno o più TelephoneContact record.
  • Ogni BusinessDepartmentContactInfo (anche) contiene uno o più TelephoneContact record.

Quindi, se esiste un codice da scrivere per il record TelephoneContact , può essere riutilizzato tra le due o più classi che lo utilizzano.

Per similarità nella struttura , ciò che intendo è la not somiglianza nei valori o la distribuzione statistica. Posso indirizzarti a un controesempio.

Il riutilizzo del codice è applicabile a tutti i paradigmi di programmazione. Alcuni paradigmi e linguaggi di programmazione hanno specifiche funzioni di sintassi e libreria per facilitare il riutilizzo del codice.

Scegliere un paradigma di programmazione per il tuo problema.

La decisione su quale paradigma di programmazione utilizzare dovrebbe venire dopo:

  • Comprendi la dimensione dei dati (ordine di grandezza) che intendi gestire.
    • Se è necessario gestire miliardi di dati, potrebbe essere necessario prendere in considerazione paradigmi alternativi, come progettazione orientata ai dati, database o elaborazione distribuita.
  • Hai una struttura di base di quali funzionalità devono essere presenti nel software, ma senza entrare troppo nel dettaglio.
  • Hai un schema / piano preliminare di come vuoi che il tuo software sia strutturato.
  • Hai identificato elementi comuni , come descritto sopra.

Decidere dove usare POD (semplice struttura dati obsoleta) o Oggetti.

Se hai deciso di utilizzare Java, si consiglia di utilizzare la progettazione orientata agli oggetti, come radarbob suggerito sopra , perché il vantaggio dell'uso di Java viene perso se non si sfrutta l'OOD.

Si presume che tu abbia completato il passaggio Class-Responsibility-Collaborations. Nella progettazione orientata agli oggetti, il risultato di CRC diventa il tuo progetto di classe Java iniziale.

Puoi apportare ulteriori modifiche al design della tua classe come meglio credi, come in refactoring .

Scrittura del codice per leggere i dati da un file e salvare i risultati in un file.

Ci sono molte scelte - così tante che è travolgente.

  • Come minimo, è necessario implementare un lettore di dati per il formato del set di dati utilizzato da D1, D2, D3 e D4.
  • Java supporta la serializzazione degli oggetti come parte della sua lingua.
  • Tuttavia, se il codice sorgente della classe viene modificato, i dati precedentemente serializzati non possono più essere deserializzati: andranno persi.
    • Poiché questo è un problema molto diffuso, ci sono molte soluzioni: (solo per citarne alcuni)

Inoltre, puoi prendere in considerazione i seguenti compromessi:

  • Spazio efficiente: occupa il minor spazio possibile sul disco - spesso significa dati binari e non leggibili dall'utente.
  • Leggibile dall'uomo - usa il testo il più possibile (XML o JSON), ma occupa più spazio su disco
  • Leggibile dall'uomo combinato con compressione standard, come GZIP. Questo è un approccio equilibrato tra spazio e leggibilità.

Devo usare un database?

Purtroppo non ho molta esperienza con il database. Altre persone possono contribuire con idee.

    
risposta data 06.10.2013 - 20:16
fonte
1

Should the data classes include their own respective 'readFromFile' functions or would it be better to have a global utility class that reads all data from file and generates the data objects?

Segui il Principio di Responsabilità Unica (SRP).

Non mettere il recupero dei dati nelle tue classi di dati.

Dai alla tua classe di dati tutte le funzionalità di cui ha bisogno; per esempio implementando Comparable, Iterator, Equality come necessario. Non fare in modo che il client di dati abbia la forza bruta per fare questo tipo di cose a l'oggetto dati.

Né l'algoritmo né le classi di dati non dovrebbero sapere come leggere i dati - dovrebbe chiedere qualche altra classe. Allo stesso modo l'algoritmo dovrebbe chiedere alla classe data di ordinare se stesso (per esempio), non farlo per la classe dati.

Riduci a icona accoppiamento

Non "rinnovare" i tuoi oggetti dati all'interno della classe dell'algoritmo, per esempio.

L'accoppiamento lento suggerisce che potresti avere essenzialmente una sorta di struttura per guidare l'intera faccenda; forse una classe per leggere i dati, uno per costruire combinazioni specifiche di algoritmi / oggetti dati (modello Factory), uno per "ottenere insieme i dati e l'algoritmo", uno per coordinare l'esecuzione dell'algoritmo, eccetera.

Pensa a OO fino in fondo nei dettagli

Non giocare a un gioco di classi "più contro meno". Questo è semplicemente sbagliato. Disegna una buona struttura (gerarchia di classi) per i tuoi dati che aderisce strongmente a SRP. Cioè, i dati di qualsiasi complessità sono probabilmente un composito di altri tipi che gestiscono ciascuno il proprio comportamento. Fatto bene, sarà stupito di quanto il codice semplice, pulito e piccolo diventi sia nella classe dati che nei client di dati contenenti.

    
risposta data 06.09.2013 - 17:57
fonte
0

Questa domanda potrebbe essere più adatta per essere pubblicata su programmers.stackexchange.com o su codereview.stackexchange.com

Tuttavia, ecco alcuni suggerimenti su quando suddividere le cose in nuove classi: link

Se fossi in te, terrei solo tre delle classi al massimo: A1, A2 e A3. In alternativa, puoi creare i tre metodi degli algoritmi della stessa classe. Per mantenere il tuo codice DRY, vuoi che un metodo sia responsabile della lettura nei file (e uno per l'output), a meno che i file di input non siano fondamentalmente diversi.

Ogni oggetto che crei ha un sovraccarico, quindi le tue prestazioni sarebbero migliori se fosse possibile creare un solo oggetto per contenere i risultati.

    
risposta data 05.09.2013 - 16:30
fonte

Leggi altre domande sui tag