Sto lottando con il modo migliore per strutturare un programma che sto scrivendo perché il metodo che attualmente mi sembra molto goffo e ogni parte dipende molto dagli altri. Questo è ciò che il programma deve fare:
- Analizza un documento word per estrarre un elenco di contatti.
- Ottieni un elenco di contatti in un gruppo specificato dal mio account Google.
- Confronta i contatti del documento word con i contatti Google e:
- Aggiorna i contatti su Google con i dettagli del documento word o
- Crea un nuovo contatto su Google se non esiste o
- Elimina tutti i contatti su Google che non si trovano nel documento word.
Anch'io voglio
- per avere una GUI per questo programma che è reattivo mentre tutto sta succedendo
- mostra un'anteprima delle modifiche che i passaggi 4-6 effettueranno prima di eseguirle e consentire all'utente di rifiutare le modifiche (tutto o niente andrebbe bene per ora)
Modifica: tutto ciò che viene da qui in poi è ciò che ho attualmente fatto. L'ho aggiunto in modo che potesse essere fornito un consiglio specifico per il refactoring se ciò fosse ritenuto necessario. Se hai un modo in cui posso strutturare questo programma, puoi quasi sempre saltare il resto.
Ho già iniziato, quindi permettimi di spiegare come ho scritto il codice finora. Il programma è scritto in C #.
-
L'analisi del documento word per ottenere un elenco di contatti è in una classe chiamata
WordDocumentParser
. Ha un costruttore che prende il percorso del documento word e un metodoGetContacts
che esegue tutto l'analisi e restituisce un elenco di contatti. Per quello che vale, sto usando COM per gestire l'analisi. -
I passaggi da 2 a 6 partendo da una nuova classe chiamata
GoogleContactsMaintainer
con un costruttore che prende l'elenco dei contatti dal documento word, un paio di gruppi importanti su Google e unContactsRequest
che è utilizzato per recuperare / aggiornare / salvare / eliminare i contatti su Google. La prima cosa che fa questa classe è ottenere i contatti da Google e abbinarli ai contatti del documento word. Il contatto Google corrispondente viene salvato in una proprietà sulla parola documento contatto. -
Quindi eseguo un'anteprima che rappresenta i prossimi 3 passaggi.
-
Inizio con l'aggiornamento dei contatti che sono stati abbinati dal documento word ai contatti di Google. Creo un
ContactUpdater
che aggiorna il contatto Google corrispondente ma non conferma le modifiche. Aggiunge anche a un elenco di stringhe tutte le modifiche che sono state apportate e imposta una proprietà booleana sul contatto per dire che è stato aggiornato. -
Il prossimo è la creazione di nuovi contatti Google per quei contatti di documenti di testo che non sono stati abbinati a un contatto di Google. Questo viene fatto in una classe
ContactCreator
che crea un contatto Google, lo imposta sulla parola contatto documento e imposta un flag su quel contatto per indicare che si tratta di un nuovo contatto. Il nuovo contatto non viene salvato. -
L'ultimo è eliminare tutti i contatti Google che non sono stati abbinati a un contatto dal documento word. Per fare questo, trovo i contatti e li aggiungo a un elenco con una descrizione che dice che saranno eliminati.
-
Al momento, visualizzo queste modifiche all'utente e le aggiorno immediatamente (spiegherò perché l'utente non può fermarlo in un minuto). Questo viene fatto nelle seguenti tre fasi.
-
Aggiornamento: trova tutti i contatti dal documento word che hanno il set di proprietà
HasBeenUpdated
, costruisci un nuovoContactUpdater
e conferma le modifiche. -
Crea: trova tutti i contatti dal documento word che hanno il set di proprietà
NewContact
, costruisci un nuovoContactCreator
e inserisci il nuovo contatto Google. -
Elimina: trova tutti i contatti Google che non sono stati abbinati a un contatto dal documento word e li elimina da Google.
Nel tentativo di mantenere la mia GUI reattiva mentre tutto questo è in corso, ho creato una classe MaintainContactsWorker
che sottoclasse BackgroundWorker
e chiama tutti i 10 passi precedenti dal metodo OnDoWork
. Questo è il motivo per cui non sono in grado di chiedere all'utente se vogliono confermare o meno le modifiche.
Per me, tutto sembra orribilmente interconnesso e completamente non testabile, quindi spero che tu possa indicare le cose che dovrei fare per rompere le dipendenze e rendere il mio codice più gestibile e verificabile.
Da quando ho scritto questo post, una cosa che sento di dover avere è un repository che gestirà le operazioni CRUD che sto eseguendo sui contatti di Google. Questo sembra un buon punto di partenza?
Grazie per tutti i suggerimenti che puoi offrire, spero di essermi spiegato abbastanza bene.