Sto provando a utilizzare i principi SOLID per la prima volta. Sto rivisitando una classe File che memorizza le informazioni sui file e rende disponibili le operazioni sui file. Questa classe viene quindi ereditata da tipi di file specifici per rendere disponibili i metodi per quel tipo.
Ho iniziato con SRP e ho provato a creare una classe astratta FileWriter
e FileReader
per leggere e scrivere da risorse diverse. Alcuni includono:
- File System
- Streams
- database
- Altri servizi non definiti (
SOAP
,REST
??).
Sono felice di dire che i dati del file sono gestiti da un array di byte, ma non sono sicuro di come gestire il percorso del file / uid per una risorsa.
Ecco cosa ho ...
public abstract class EFileReader
{
event EventHandler<IEFileEventArgs> ReadThreadedComplete;
public abstract byte[] Read(object source);
public abstract async Task<byte[]> ReadAsync(object source);
public abstract void ReadThreaded(object source);
protected virtual void OnFileRead(IEFileEventArgs e)
{
EventHandler<IEFileEventArgs> handler = this.ReadThreadedComplete;
if (handler != null)
{
handler(this, e);
}
}
}
Potrei trasmettere l'oggetto come tipo richiesto nell'implementazione. In alternativa potrebbe essere un tipo generico in qualche modo specificato nell'implementazione (non so come).
public abstract class EFileReader<T>
{
event EventHandler<IEFileEventArgs> ReadThreadedComplete;
public abstract byte[] Read(T source);
public abstract async Task<byte[]> ReadAsync(T source);
public abstract void ReadThreaded(T source);
protected virtual void OnFileRead(IEFileEventArgs e)
{
EventHandler<IEFileEventArgs> handler = this.ReadThreadedComplete;
if (handler != null)
{
handler(this, e);
}
}
}
... O forse c'è qualche astrazione della fonte che posso scrivere per accogliere i vari possibili casi d'uso.
Immagino che potrei farcela prendere una classe FileResource
astratta che espone uno stream.
Qual è il modo migliore per avvicinarsi a questo?