2009-07-14 70 views
5

創建類時我總是停下來。我對建築非常感興趣,所以對我很感興趣。這是我的困境。我最終在一個課堂中發現了一個問題,我必須問自己:「當我從班級的財產或私人支持領域得到我需要的東西時,這個方法是否需要參數?」。方法參數困境

現在對於公共方法,顯然你應該最有可能擁有參數,因爲有人會消耗你的類,並使用這些方法,無論它們是在實例類還是靜態類。這場辯論不是關於公共方法,因爲這對我來說很明顯。如果你的類中有一個公共方法,儘管可以說你可以從該類的屬性或私有字段中獲得所需的值之一,而不需要該方法的參數並使用該參數,應該仍然需要參數並使用參數,或者至少在指定一些參數時不要計算它們。至少這是我如何查看公共方法,因爲誰知道別人可能會如何使用該方法,並且他們需要知道需要傳遞什麼,並且他們需要將實際數據傳遞給方法,因爲它們不在您的類中。

問題出現時,例如我創建和使用私有方法或類似的東西。可以說我創建了一個自定義控件(.cs)。它的工作是運行一些方法,我已經打破了這個控制的邏輯,並創建了一些HTML字符串輸出到瀏覽器。那麼,我創建一個公共屬性,以便誰使用這個控件可以給它一個特定的對象。這個特定的對象是我班中一半的方法用來幫助生成HTML。因爲它是一個屬性,所以我的自定義類中的任何方法都可以使用它。所以它完全繞過了在這些方法中創建參數的任何需要,因爲我可以從屬性中獲取它。但是後來我開始創建大量的無參數方法,因爲我從後臺字段或後臺字段和屬性的組合中獲取對象。或者我可能只是從一些推理中獲得他們,而我能夠在課堂上得到我需要的其他方法?但接下來有些東西對你說沒有,那是壞人,你確實需要一段時間的參數......至少有一些參數組合,並在方法中使用了一些支持字段或屬性等,但並不總是折扣參數即使這些參數可能是傳遞給它的一些內部結構(字段或屬性)。但是,如果我要將內部結構作爲參數傳遞,那麼只是訪問和使用這些領域或屬性之間的界限,而不是通過方法作爲參數,而是直接在方法本身內部。

但是,困擾我,因爲然後我質疑爲什麼我需要方法參數的情況下,我可以在其他地方獲得價值。

有人可以在這裏解釋細線,並幫助我得出結論:在方法或屬性中使用大量的支持字段,而不是在方法中指定的某些參數之間。儘管其中一些參數當另一個方法調用它時,可能仍然會從後臺字段或屬性傳遞一個值?

我希望這可以讓人產生任何感覺,但我不能成爲唯一遇到這種困境的人。也許我是唯一一個思考這個問題的人,我認爲我不知道。但是我個人對OOP的主要問題是有很多該死的方法來獲得你需要的東西(構造函數,屬性,後臺字段,方法)。

回答

5

少喝咖啡,少的話;-)

總結

時的方法使用的參數?

簡短的回答

時所需的信息提供已經在對象,按照不重複自己的原則

參的方法都很好,沒有必要告訴對象它已經知道的東西

+0

這是我從一個密友獲得的答案,這也是我認爲的另一個很不錯的答案:首先,公共方法:外部調用者是否需要提供差異值?對於私人(和公共)思維繼承,以及如果不同的值將被傳遞... – PositiveGuy 2009-07-14 02:56:27

1

Steve很好的回答。 只需在C#4.0中添加,您也可以使用默認參數的功能。這在某些情況下非常有用,特別是實用程序類。我在我的OracleHelper類中有這樣的方法

ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans, CommmandType cmdType) 

大多數調用者不需要提供事務和命令類型。使用默認參數,我可以寫爲

ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans=null, CommmandType cmdType = CommandType.StoredProcedure) 

的調用者可以叫

OracleConnection connection = new OracleConnection(connectionString); 
OracleHelper.ExecuteReaderNoParam(conn, "SP_GET_ALL_STATUS"); 
0

而且(關於其他的答案)的方法,少參數更具可讀性和方便的方法。如果一個方法需要很多參數,它可能違反了Single Responsibility Principle,並可能分成幾個更簡單的方法,這將更容易使用和理解。