2011-08-24 72 views
3

我有一個類StreamCopyOperation它爲我提供了諸如複製操作的平均速度和其他信息。我的所有參數是否應該在構造函數中?

現在我有一個構造函數,它看起來像

​​

和方法

public void CopyStream() 
{ 
    //Copy the streams, send the progress updates, etc... 
} 

現在我不知道是不是所有的參數應該在構造函數或流應該傳遞在這樣的方法:

public void CopyStream(Stream source, Stream target) 
{ 
    //Copy the streams, send the progress updates, etc... 
} 

和構造函數只獲取緩衝區大小和更新間隔已過。 或者,也許一切都應該在CopyStream方法。

有沒有像最佳實踐或這只是一個設計決定?

+0

也許像構造函數需要在源和CopyStream需要在目的地? –

+0

我不會有一個名爲StreamCopyOperation的類,名字本身告訴你,這應該是一個方法,而不是一個類。你可以有一個實用程序類,它具有將一個流複製到另一個流的方法。 – Icarus

回答

4

我認爲這是一個基於設計決定後,你如何期望類將被使用。

如果它是一個使用一次類型的類的話,也許所有的參數應該被傳遞到構造函數,然後你設置任何其他屬性,然後調用CopyStream(不帶參數)。

但是,如果你指望流參數改變,那麼不把它們傳遞到構造函數和有值傳送到CopyStream方法。

最後,如果它真的是更多的一次使用類的類,那麼也許你應該認爲這個類是一個static類,而CopyStream是靜態的 - 爲你節省了一行代碼並使得類更多地是一個類助手類的類。

希望這會有所幫助!

+0

同意這一切都取決於操作對象的使用和生命週期。說得好! – Reddog

+0

@Reddog - 謝謝! –

0

如果您將在類範圍內使用那些Stream(例如其他方法),最好將它們作爲構造函數參數傳遞並將它們分配給在類的作用域中聲明的變量,否則無需將它們傳遞給構造函數並推薦使用第二個CopyStream方法。

希望得到這個幫助。

0

我幾乎認爲它是一個設計決定。

如果CopyStreamOperator的單個實例沒有被重用於多個源和/或目標,我可能會在構造函數中傳遞所有必需的值以創建一個知道它需要知道的所有對象的對象。然後可以驗證輸入值以確保操作員不會處於無效狀態。

然後將無參數CopyStream()方法重命名爲Run()Execute()

1

這實際上取決於您如何使用CopyStream。它會被頻繁使用嗎?這會建議使用CopyStream方法的方法參數。如果它被設計爲一次性調用,那麼在啓動類型的新實例時使用構造函數參數。

0

我會考慮使用默認值,不是那麼必要的細節,並提供屬性的類的那些細節設置或獲取它們的值:

private const int DEF_BUFFER = 100; 
private const int DEF_INTERVAL = 10; 

public StreamCopyOperation(Stream source, Stream target) 
{ 
    //Initialize values 
    this.BufferSize = DEF_BUFFER; 
    this.UpdateInterval = DEF_INTERVAL; 
} 

public int BufferSize { get; set;} // or use a private member inside, if needed 

public int UpdateInterval { get; set;} // or use a private member inside, if needed 
2

在我看來,這將取決於StreamCopyOperation對象的生命週期...

特別地,由於流對象通常是(總是?)一次性並綁定到一些系統資源,我想保持他們儘可能少的時間,所以我會考慮採取參數化的方法。

如果StreamCopyOperation僅與流自身的生命週期綁定,那麼第一種方法是適當的。但是如果你想讓操作對象保持更長的時間(例如,因爲它連接到UI),那麼我將使用參數化函數的方法,並進入更多的靜態「輔助類」。

+0

+1,以考慮流是IDisposable。沒有考慮到這一點。 –

0

我的設計指南是隻要求用戶提供構造函數構造實例所必需的東西。也許用戶不需要進度更新。也許用戶在構建實例和連接進度事件時還沒有兩個流。

當然,您可以提供方便的構造函數重載(或可選參數),以便在更多情況下使用您的類更容易(但這些可以推遲到「構造方法」,例如TimeSpan.FromMinutes(5))。但請記住,構造函數旨在簡單地創建並初始化您的類型及其所有子系統,以使其處於可用的一致狀態,隨時可以執行用戶的出價。

當然,異常是不可變的類型,您必須在構造過程中指定所有參數。通常不可變類型相當簡單,所以這不是問題。如果它們更復雜,並且構造函數參數的數量增長失控,則可以使用可變的「初始化符指示符」對象,該對象包含如何初始化不可變對象的所有不同配置,但更容易使用,因爲它具有可變屬性。

相關問題