2012-02-28 72 views
11

我有一個接口定義爲:可以將流傳遞給多個方法嗎?

public interface IClientFileImporter 
{ 
    bool CanImport(Stream stream); 
    int Import(Stream stream); 
} 

的想法是採取任何文件流,並通過一系列這個接口的實現的運行它來確定哪一個應該處理該文件。一些實現可能會尋找一定的標題行,而其他人可能會尋找一定的字節序列,等等

我的問題是,是否確定,只要通過周圍流這樣的,因爲我從來沒有關閉它?每種方法都必須負責將流重置爲位置0(如有必要),但還有其他潛在問題(除了線程安全性)嗎?這個代碼真的很氣味,國際海事組織,但我不知道有一個更好的方法來做到這一點。

+0

我認爲這不是一個壞概念。您不知道流中需要哪些實現,因此提供整個流是有意義的。爲了確保實現不會混淆流,你可以實現某種類型的包裝(從流本身派生),該包裝禁止修改底層流或任何你需要的任何方法。另外,我不需要實現來重置流的位置。 CanImport/Import的調用者可以做到這一點。綜合這可以確保沒有importorr可以傷害基礎流。 – 2012-02-28 20:41:17

回答

3

爲了防止底層流不被修改,創建一個從流派生並只轉發安全調用包裹流的包裝流。另外,不要假設Import/CanImport方法重置流的位置。這些方法的調用者應該在將流傳遞給Import/CanImport之前將其重置爲有效狀態。

+0

在這個只讀流包裝器中,重寫Dispose方法以自動倒回流但不關閉它會好嗎? – Chris 2012-02-28 21:16:10

+0

是的,這當然可以工作,這樣你可以使用一個方便的使用塊來調用CanImport/Import – 2012-02-28 23:17:27

2

如果每個函數返回流只是它得到它的方式,我不認爲有它的問題。

+0

爲什麼該方法不能修改流?我認爲從流中讀書和寫作是你傳遞它的原因。 – cadrell0 2012-02-28 20:41:00

+0

如果它修改了流,你可以進入函數之間的各種依賴關係。它可以,但是OP每次談到倒帶流。 – zmbq 2012-02-28 20:42:33

2

這應該不是問題。

雖然我可能會重新調整它稍微:

public interface IClientFileImporter 
{ 
    int Import(Stream stream); 
} 

然後我會在導入方法返回-1,如果它不能夠。可以讓你的其他代碼更簡單一些。

+0

我同意克里斯,很好的回答克里斯。我認爲這會讓它更容易 – 2012-02-28 20:46:55

0

將相同的流傳遞給多個方法是完全正確的。

謹防非尋求-能流 - 有你不能復位位置流。 Andre Loker的評論有很好的建議來包裝Stream,所以CanImport方法不會混淆實際的流。

你也可以考慮明確規定流於CanImport方法的一些「標題」部分,也將會使他們失去了彈性。

0

如果您擔心會傳遞流,因爲您最終可能會運行可能不可信的外部代碼,那麼您可以做的最好的方法是創建一個新的只讀流並傳遞它,以便不需要外部代碼改變文件的內容,直到你確定要讓它們。

public class ReadonlyStream : Stream 
{ 
    public ReadonlyStream(Stream baseStream) 
    { 
     ownerStream = baseStream; 
    } 

    private Stream ownerStream; 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override int Write(byte[] bits, int offset, int count) 
    { 
     throw new InvalidOperationException(); 
    } 

    // Other code ommitted 
} 
相關問題