2013-11-25 84 views
10

對於代碼行中的「獲取」大小是否有任何指導原則或普遍共識?我有一個成員的Get方法,在這裏很容易增長到30行代碼。我不確定在什麼時候這應該被拉入方法。但是,我只是將它稱爲GetMyString,然後將值賦給另一個成員,並在構造函數中調用它。獲取方法的大小

是否值得這樣做?

這對SO來說太主觀了嗎?

+0

我並不清楚特性的具體指導原則,但許多最佳編碼實踐將7-10行用作一種方法中的首選行數。 –

+3

你的吸氣劑在做什麼? –

+0

好問題。 getter被用於包含類似於以下文章的功能的類中:http://umerpasha.wordpress.com/2013/06/13/c-code-to-get-latest-tweets-using-twitter-api- 1-1 /你會注意到那裏有很多刺(例如baseString),可以從該類的其他成員(例如所有OAuth令牌)構建。 –

回答

15

dcastro的答案是好的,但可以使用一些擴展:

  • 它並不需要很長時間來恢復

那不是量化;讓我們量化一下。一個財產不應超過比獲得一個領域所需的時間長十倍。

  • 它不連接到外部資源(數據庫,服務等)

這些都是緩慢的,因此通常第一個規則下摔倒,但這個第二個方面:故障應難得或不可能。屬性獲取者不應該拋出異常。

  • 它沒有任何副作用

我想澄清的是,以觀察到副作用。屬性獲取器通常會產生副作用,即他們只計算一次屬性並稍後緩存它,但這不是可觀察的副作用。

不僅在哲學上讓屬性產生可觀察的副作用,它還會弄亂您的調試體驗。請記住,當您在調試器中默認查看對象時,調試器會自動調用其屬性getters並顯示結果。如果這樣做很慢,那麼這會減慢調試速度。如果這樣做可能會失敗,那麼您的調試體驗將充滿失敗消息。如果這樣做有副作用,那麼調試程序會改變程序的工作方式,這可能會使得很難找到該錯誤。您當然可以關閉自動屬性評估功能,但最好先設計好的屬性。

+0

感謝您在Eric的指點!我不是量化的忠實粉絲;我認爲「不應該比普通數據訪問花費更多的時間」是一個很好的處方。這不像任何人會真正衡量需要多長時間。關於其他一切 - 現場! +1 – dcastro

+1

@dcastro:當然,這不是一條硬性規定,而是一條關於如何知道自己什麼時候速度太慢的一般指導原則。換句話說:你不應該擔心在內部循環中訪問一個屬性。 –

+0

這絕對是一個好方法! – dcastro

2

這是一個常見的不好的做法,將一大堆行放入Get方法中。 我在Visual Studio中安裝了一個名爲CodeMaid的東西。它有一種叫做CodeMaid Spade的方法,它爲每種方法評分並給你一個分數。分數越高,您的方法越糟糕。它也可以用於屬性。我建議你試一試,它有助於格式化,縮進和其他一些良好做法

12

這不是真正重要的大小(沒有雙關語意圖)。 它的確定有你的邏輯在吸氣只要

  • 它並不需要很長時間來恢復
  • 它不連接到外部資源(數據庫,服務等)
  • 沒有關係沒有任何副作用

這些只是適當的財產使用的一些準則。

編輯

上述原則都有一個理想:屬性訪問應該表現得像數據訪問,因爲這是用戶所期望的。

從書有效的C#由比爾·瓦格納:

屬性是可以從調用代碼類似 數據被視爲方法。這會給用戶的頭部帶來一些期望。他們將 看到一個屬性訪問,就好像它是一個數據訪問。畢竟, 這就是它的樣子。您的財產訪問者應該不辜負那些期望。獲取訪問者不應該有可觀察的一面 影響。 Set訪問者修改狀態,用戶應該能夠 看到這些變化。

屬性訪問器對您的用戶也有性能 的期望。屬性訪問看起來像一個數據字段 訪問。它不應該具有與簡單的數據訪問明顯不同的性能特徵,即 。

屬性訪問 不應執行冗長的計算,或者進行跨應用 調用(如執行數據庫查詢),或做其他冗長 操作,這將是與你的用戶對屬性訪問的期望 不一致。

加成阿爾貝託:http://msdn.microsoft.com/en-us/library/vstudio/ms229054%28v=vs.100%29.aspx

+0

這正是我正要寫的。如果你問我,「副作用」部分是最重要的。 –

+1

+1。任意線限制就是 - 任意的。我們應該儘可能小 - 但是由於任意限制而將方法分開可能會妨礙可讀性。 –

+0

我想添加一個很好的閱讀關於屬性和方法之間的選擇:http://msdn.microsoft.com/en-us/library/vstudio/ms229054%28v=vs.100%29.aspx – Alberto

1

作爲一般準則,一個方法應該不會有在一個屏幕上比配合更多的行。如果你必須滾動,它太大了。將它分成更小的方法。

+1

我相信方法應儘可能小而且不要小。僅僅因爲一些任意的限制(一個屏幕 - 什麼分辨率?)將方法分解到其他方法 - 可能會妨礙可讀性。常識超出了任意限制。 –

+1

誰的屏幕? :)有時可以用很長的方法。只有邏輯應該決定一個方法的大小。 –

3

這不一定是壞事,但如果是我,它會讓我緊張,我會試圖以某種方式嘗試並分解它。吸氣劑是一種簡單的方法,只要將整件事物拖入30多條線的方法就會浪費我的時間。我會努力把它切碎。例如。如果它是一個帶有一些檢查的循環,則將檢查提取爲方法或其他類型。