Scrivo un sacco di codice che prevede tre passaggi di base.
- Ottieni dati da qualche parte.
- Trasforma i dati.
- Metti quei dati da qualche parte.
In genere finisco per utilizzare tre tipi di classi, ispirati ai rispettivi modelli di progettazione.
- Fabbriche - per costruire un oggetto da qualche risorsa.
- Mediatori - per utilizzare la fabbrica, eseguire la trasformazione, quindi utilizzare il comandante.
- Comandanti - per mettere quei dati da qualche altra parte.
Le mie classi tendono a essere piuttosto piccole, spesso un singolo metodo (pubblico), ad es. ottenere dati, trasformare dati, lavorare, salvare dati. Questo porta a una proliferazione di classi, ma in generale funziona bene.
Dove lotto è quando vengo a test, finisco per test strettamente accoppiati. Ad esempio;
- Factory - legge i file dal disco.
- Commander - scrive i file sul disco.
Non posso testare l'uno senza l'altro. Potrei scrivere un codice "test" aggiuntivo per fare anche lettura / scrittura su disco, ma poi mi sto ripetendo.
Guardando a .Net, il File class ha un approccio diverso, unisce le responsabilità (della mia) fabbrica e il comandante insieme. Ha funzioni per creare, eliminare, esistenti e leggere tutto in un unico posto.
Dovrei cercare di seguire l'esempio di .Net e combinare - in particolare quando si tratta di risorse esterne - le mie lezioni insieme? Il codice è ancora accoppiato, ma è più intenzionale - accade all'implementazione originale, piuttosto che nei test.
Il mio problema qui è che ho applicato un Principio di Responsabilità Unica in modo un po 'troppo zelante? Ho classi separate responsabili per lettura e scrittura. Quando potrei avere una classe combinata che è responsabile della gestione di una particolare risorsa, ad es. disco di sistema.