Classe extra per scrivere dati su qualche back-end?

1

Qual è la pratica comune per scrivere classi che prendono una classe di dati e la memorizzano su qualche backend? Nel mio caso ho classi di tabelle (colonne, intestazioni, ecc.) Scritte in Excel. Quindi ho una tabella di classe con i dati e una classe ExcelDocument con operazioni di accesso e scrittura di base (celle, ...).

Dove inserirò il codice che sa come gestire i dati di Table e sa come scrivere ExcelDocument? Entrambi potrebbero essere soggetti a refactoring ad un certo punto.

Devo usare Table.write_to_excel(excel) o ExcelDocument.write_table(table) o anche alcuni hanno bisogno di una classe intermedia? Con il concetto "una classe dovrebbe servire a un solo scopo" molto probabilmente scriverò una classe intermedia?

    
posta Gerenuk 19.03.2012 - 13:35
fonte

3 risposte

2

Prenderò in considerazione la modellazione del formato di output come classe separata. In altre parole, vai con la tua idea ExcelDocument . Ciò si presta bene a qualcosa di simile al modello di strategia se è necessario supportare più formati di back-end, ora o in futuro .

Avresti un'interfaccia che definisce le operazioni che esegui sull'archivio dati, come la lettura e la scrittura. Quindi si implementa quell'interfaccia in un certo numero di sottoclassi, ciascuna progettata per gestire un tipo specifico di back-end, come file CSV, file Excel XLS, database SQL insetto-qui-qui. Se hai solo un output adesso, non hai necessariamente bisogno dell'interfaccia, ma se sei sicuro che aggiungerai altri formati in futuro, prenditi cura della gerarchia delle classi ora.

Ovviamente, dipende da quanto siano complesse queste azioni. Potresti preferire la scomposizione in entrambe le classi "lettore" e "scrittore" invece di mettere tutto in uno. Questo potrebbe anche essere più in linea con Principio di responsabilità singola .

    
risposta data 19.03.2012 - 13:51
fonte
2

Puoi affrontare questo problema con una mentalità di dipendenza delle dipendenze: la tabella dovrebbe esporre un'interfaccia necessaria per scrivere se stessa in un archivio persistente.

Potresti passare questo nel costruttore di tabelle:

Table(ITableWriter tableWriter)
{
    _tableWriter = tableWriter;
}

E quindi Table implementa qualcosa come:

void Write(string writeID)
{
    //for all rows in the table
    _tableWriter.Write(writeID, rowToWrite);
}

Quindi le tue chiamate potrebbero essere:

var excelWriter = new ExcelWriter(); // implements ITableWriter
var table = new Table(excelWriter);
table.Write("DocumentName");

Il trucco è quindi definire la classe ExcelWriter che implementa l'interfaccia ITableWriter , con il deliverable che è un documento Excel.

In questo modo, se dovessi scrivere la tabella da qualche altra parte (in un altro database? in un file flat?) non dovrai modificare la classe Table, ma solo produrre un'altra implementazione dell'interfaccia ITableWriter .

Come bonus aggiuntivo, puoi prendere in giro l'interfaccia ITableWriter per test separati della tua classe Table .

    
risposta data 19.03.2012 - 13:51
fonte
1

Hai ragione, quelle classi dovrebbero servire a un unico scopo in quanto rappresentano il tuo modello . Dovresti scrivere una classe servizio che trasformi una di queste classi nell'altra quando necessario.

Strutturalmente, le classi di servizio e le classi di modelli sono le stesse, ma sono lì per definire le preoccupazioni separate dei diversi livelli di un'implementazione MVC, per esempio. Una classe di servizio concreta definisce l'API di un servizio esterno, come la trasformazione di una tabella di dati in un foglio di calcolo Excel e una classe di modello definisce l'API del modello di dati dell'applicazione.

Quindi, mentre le classi base possono essere simili, le classi concrete create estendendo queste classi base servono due scopi completamente diversi.

    
risposta data 19.03.2012 - 13:47
fonte

Leggi altre domande sui tag