2011-04-04 41 views
6

何時將局部變量作爲參數推送到函數/方法,而不是使用類變量來代替函數/方法變量,這是一種很好的形式。使用類變量與將局部變量發送到函數/方法

舉例來說,我可以有一個功能:

int DoSomething(int var) 
{ 
    if(var == -1) 
    return 0; 
} 

或者我可以有一個類變量「_var」,並用它在相同的功能,就像這樣:

int DoSomething() 
{ 
    if(_var == -1) 
    return 0; 
} 

我如果我們在上面的例子中有一個函數/方法需要使用一個類變量,稱爲DoSomething,那麼我應該把函數/方法的類變量作爲參數發送給函數/方法,這樣函數就更容易了閱讀和測試。

什麼時候該做什麼好的形式?我知道這是一個加載的問題,但我試圖爲我與同事的爭論提供一個案例,他們說我會向函數/方法簽名添加更多代碼,而不是保留函數/方法簽名較小。

在我看來,通過將類變量推送到相應的函數/方法,而不是強迫他們依賴/瞭解類變量的存在,我將代碼更簡潔,更容易維護。

請指教。

回答

10

藍色的唯一答案,對於任何一般情況是:這取決於您的具體情況。數據成員,靜態成員和函數參數都服務於不同目的。當然,我們可以給出一些關鍵的提示,您可以選擇哪種類型的標誌來選擇其中一種。

典型病例:

  • 數據構件:該值是對象的(如在一個類的實例)的狀態的一部分。你想要其他方法來調用這個特定的狀態。
  • 靜態成員:該值具有同時存在,與全部相同的含義該類的實例。這通常僅用於常量(即使在運行時初始化,如單例),但在某些情況下,需要可變類的狀態。
  • 函數參數:該值僅對函數/方法的特定執行有意義。這個值可能會隨着一次調用而改變。

有一些不良選擇的常見症狀。

考慮以下問題:

  • 你總是相同的值傳遞給方法,無論你來自哪裏打電話嗎?考慮讓參數保持不變並將參數隱藏起來。考慮定義重載:一個沒有關於普通情況的論證,另一個關於靈活性的論點。
  • 你每次調用函數時都需要設置一個數據成員(通過setter)嗎?考慮將值作爲函數的參數。如果您需要用兩條線路替換每個呼叫以預先設置該值,則無需保存功能簽名。

我的印象是,你和你的同事對這個參數的性質有一個簡單的誤解。確保你清楚地理解你的同事的論點,並讓自己清楚。嘗試改述你想說的是什麼。

+0

感謝您的反饋安德烈。我的同事的原始設計是通過構造函數對類變量進行動態初始化,並且該類變量在類中的多個函數中使用。我刪除了這個依賴關係,而是將有問題的變量發送給一個函數調用,然後在其他函數調用中使用它。由於變量沒有封裝數據然後在其他地方傳播,我認爲DoSomething(int var)函數會更合適。再次感謝您的深思熟慮的迴應。 – Rick 2011-04-04 15:42:11

2

我以依賴關係來看它,即誰依賴於變量(在你的情況下是var),它是一種方法還是一個類?

例如, JavaBeans的類變量依賴於類,所以如果類需要這些變量,那麼DoSomething()是最好的。

另外,如果你的類不關心var,並且不需要任何其他地方,只需要DoSomething()var,然後DoSomething(int var)是必不可少的。

+0

感謝您的回覆!是。這正是我正在準備的論點,在我對安德烈的評論中概述。 – Rick 2011-04-04 15:43:13

0

它不應該是關於什麼給或多或少的代碼或需要更多努力鍵入。這是關於什麼是在該類和功能的背景下更合理。像你一樣保持彼此隔絕的東西通常是件好事,但不要過度。從函數的目的來看,它應該處理類var中包含的值,它應該這樣做,而不是通過參數接收值。