2014-11-03 83 views
0

(Cross-post programmers.stackexchange) 我想第一次使用SOLID原則。我正在重新考慮一個存儲文件信息並使文件操作可用的File類。 然後,該類將繼承到特定的文件類型,以爲該類型提供可用的方法。我的第一次SOLID重新分解

我已經開始使用SRP,並嘗試使用抽象類FileWriterFileReader來讀取和寫入不同的資源。一些包括:

  • 文件系統
  • 數據庫
  • 其他未定義的服務(SOAPREST ??)。

我很高興地說文件數據是由字節數組處理的,但我不確定如何處理資源的文件路徑/ uid。

這是我有...

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); 
     } 
    } 
} 

我能投的對象爲在實施所需的類型。 或者它可能是一種通用類型,它在實現中以某種方式指定。

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); 
     } 
    } 
} 

我可以在實現中定義或約束T

......或者也許有一些我可以編寫的源代碼抽象以適應各種可能的用例。 我想我可以讓一個抽象的FileResource類公開一個流。

解決此問題的最佳方法是什麼?

+1

我會看看我在SOLID。你可能有一個通用的接口,但是有些東西比如說一個文件路徑與說db連接非常不同。 – Kirby 2014-11-04 00:15:53

+0

謝謝@Kirby,那是我看到的問題。不同的資源不一定共享任何共同點。我能想到的一個例子可能是使用文件數據的多部分表單提交。有了@ NSFW的建議,多部分的例子可以用'FileStorage' implmentation覆蓋,但它不需要'FileIdentifier'。 – Ablue 2014-11-04 01:29:48

回答

1

我認爲你正在創建一個新類型的正確軌道,但我會把它稱爲FileIdentifier。它不一定會「揭露甲流」本身,而是將與FileStorage類使用,像

abstract class FileStorage 
{ 
    public abstract Stream GetStream(FileIdentifier id); 
} 

的的FileReader類可能並不需要抽象的了 - 而不是它的構造將需要FileStorage的實例

class FileReader 
{ 
    FileReader(DiskFileStorage storage).. 

    override byte[] Read(FileIdentifier id) 
    { 
     Stream stream = this.storage.GetStream(id); 
     return stream.Read.... 
    } 
} 

你可以有DiskFileStorage,NetworkFileStorage,DatabaseFileStorage等,具有相應FileIdentifer派生類:派生類,它會把自己從一個文件中獲取流的細節。 DiskFileIdentifier只是包裝一個文件路徑字符串,NetworkFileIdentifier可能包裝一個URL,DatabaseFileIdentifier可能包裝一個用戶名,密碼,表和主鍵等等。

+0

我的問題是基類'FileIndentifier'抽象類或接口是什麼樣子?「FileIdentifier」的不同實現是否共享任何內容? – Ablue 2014-11-04 01:23:37

+0

我想我只是將基類留空。關於它的一切都將針對相應的存儲類。 – NSFW 2014-11-04 05:23:00

相關問題