Qual è il modo giusto per raggruppare questo progetto in classi?

4

Inizialmente l'ho chiesto a SO, dove era chiuso e ho raccomandato di chiederlo qui. Sto cercando di capire come raggruppare tutte le funzioni necessarie per il mio progetto in classi. L'obiettivo del progetto è eseguire il seguente processo:

  1. Ottieni le credenziali FTP dell'utente (nome utente e password).
  2. Verificare che le credenziali stabiliscano una connessione valida al server FTP.
  3. Interrogare diversi elenchi di SharePoint e unire i risultati di tali query per creare un elenco di elementi che devono essere sottoposti a un'azione.
  4. Ogni elemento nell'elenco ha una cartella. Per ogni articolo:
    • Comprimi il contenuto della cartella.
    • Carica la cartella sul server FTP usando SFTP
    • Aggiorna i dati di Sharepoint dell'articolo.
  5. Invia all'utente un rapporto Excel che mostri, ad esempio,
    • Articoli senza percorsi cartella
    • Elementi che non sono riusciti a comprimere o caricare

I passaggi 2-5 vengono eseguiti su base periodica; se il passaggio 2 restituisce una connessione non valida, l'utente viene avvisato e il processo ritorna al punto 1. Se in qualsiasi momento l'utente preme un determinato tasto, il processo termina.

Ho definito il seguente set di classi, ognuna delle quali è nel proprio file .cs:

SFTP : processi di trasferimento file

DataHandler : recupero dei dati di SharePoint / processi di query / aggiornamento. Crea e carica anche i file zip.

Exceptions : non solo una classe, questo è il file .cs in cui ho tutte le mie classi di eccezioni.

Report : crea e invia il rapporto.

Program : la classe principale per l'esecuzione del programma.

Riconosco che la classe DataHandler è un oggetto dio , ma non ho una buona idea di come refactoring Mi sembra che dovrebbe essere più fine di quanto non lo sia solo in Sharepoint, Zip e Upload, ma forse è così.

Inoltre, non ho ancora elaborato come combinare il comportamento periodico con la parte "attesa per l'input dell'utente in qualsiasi punto del processo"; Penso che coinvolga i thread, il che significa che altre classi gestiscono i thread ...

Non sono molto esperto in design pattern, ma ce n'è uno che si adatta bene a questo progetto?

Se questo argomento è troppo grande per essere spiegato chiaramente in una risposta SO, accetterò anche un collegamento a un buon tutorial su ciò che sto cercando di fare qui.

    
posta sigil 20.09.2012 - 00:53
fonte

2 risposte

2

@Emmad ha centrato la testa sulla nota relativa alla Single Responsibility.

Se segui un approccio Comportamentale alla progettazione della classe (ignorando tutti gli elementi di testing unitario per il momento e pensando più alle linee dei Behaviors che il tuo programma deve supportare), potresti iniziare con entità che rappresentano singole aree di funzionalità, ad esempio, potresti finire con le singole classi per ciascuno dei seguenti

  • Gestore degli input utente
  • Credenziali utente (oggetto dati semplice o struct?)
  • Convalida credenziali utente
  • Query su SharePoint
  • Compressore cartelle
  • Sender della cartella
  • Connessione FTP
  • Updater di SharePoint
  • Connessione Sharepoint
  • Report (oggetto dati semplice o struct?)
  • Generatore di rapporti
  • Segnala mittente
  • Connessione email

Il motivo per cui utilizzarli come punto di partenza non è necessariamente quello di modellare esattamente ciò che apparirà nel tuo codice finale, ma di fornire un accoppiamento lento finché non hai un codice di fronte a te che ti dà una migliore comprensione del problema e come tutto si adatta insieme.

In generale, è più facile aggiungere complessità a una classe semplice piuttosto che semplificare qualcosa che ha iniziato in maniera complessa in primo luogo; Allo stesso modo, se si finisce con una soluzione di lavoro e si decide di unire alcune delle classi, allora è anche più facile fare che dividere una singola classe che aveva iniziato a fare troppo.
(Ricorda che i problemi sono raramente banali come sembrano all'inizio, specialmente quando inizi a pensare al controllo del flusso degli errori, alla registrazione di debug, alle risorse usa e getta, ecc. - qualcosa che inizia come "Oh, possiamo farlo con una riga di codice "potrebbe rivelarsi molto più di una riga)

Facendo questo potresti anche notare dei pattern nei tipi di nomi dei metodi che stai usando, che potrebbero prestarsi a interfacce e astrazioni che in precedenza non erano evidenti dal considerare il problema originale.

    
risposta data 20.09.2012 - 06:05
fonte
1

DataHandler, non sta seguendo SRP. Sta facendo molte cose diverse. Potrebbe mancare una classe (o più) che sarebbe responsabile della gestione delle credenziali dell'utente (creazione, aggiornamento, cancellazione) di un utente. Inoltre, potresti voler gestire i report di Excel separati da Invio via email del rapporto (2 classi non 1) poiché il reporting è il processo di invio di un report Excel, queste sono 2 diverse responsabilità.

    
risposta data 20.09.2012 - 01:00
fonte

Leggi altre domande sui tag