2012-08-04 75 views
10

我注意到,即使在遵守OOD的單一責任原則時,有時候類仍然會變大。有時在方法中直接訪問成員變量感覺像是具有全局狀態,並且在當前範圍中存在很多東西。僅僅通過查看當前工作的方法,就不可能再確定當前範圍內的可訪問變量的來源。直接訪問成員變量或作爲參數傳遞?

當與朋友一起最近的工作,我發現我寫的比他更冗長的代碼,因爲我通過成員變量仍參數爲每個單獨的方法。

這是不好的做法?

編輯:例如:

class AddNumbers { 
public: 
    int a, b; 
    // ... 
    int addNumbers { 
     // I could have called this without arguments like this: 
     // return internalAlgorithmAddNumbers(); 
     // because the data needed to compute the result is in members. 
     return internalAlgorithmAddNumbers(a,b); 
    } 

private: 
    int internalAlgorithmAddNumbers(int sum1, int sum2) { return sum1+sum2; } 
}; 
+1

如果你的課程太大,將它們分開。如果你有一個成員變量使用它。如果你在一個方法中沒有使用成員變量,它應該是'static',但這樣做聽起來很奇怪。 – Flexo 2012-08-04 17:29:08

+1

不好意思,我的英文似乎有點小問題。你傳遞成員變量作爲參數?公共成員變量?或者這些成員變量的新值?我有點困惑。 – ATaylor 2012-08-04 17:29:44

+0

對不起,我不明確。在實現算法時,我通常會重新迭代它在方法簽名中使用的參數,但算法需要的數據實際上可以直接從成員變量中拉取。讓我們假設你有一個類,它添加了兩個數字,並且有兩個數字a和b作爲成員變量。然後,而不是具有零參數的私人添加方法,我仍然會定義一個採用2個int參數的函數。像這樣,我以後可以在課堂外重複使用該算法。 – Tom 2012-08-04 17:32:29

回答

5

如果一個類成員變量,使用它們。如果你想明確地傳遞參數,使它成爲一個自由函數。通過傳遞成員變量不僅使代碼更加冗長,還違反了人們的期望並使代碼難以理解。

一類的整個目的是創建具有隱式傳遞共享狀態的一組功能。如果這不是你想要做的,不要使用課堂。

2

是,definetely一個不好的做法。 從我的角度來看,將成員變量傳遞給成員函數根本毫無意義。 它有幾個缺點:

  1. 減少代碼可讀性
  2. 成本中的表演術語的參數複製堆棧

該方法最終轉化爲簡單的功能上,可有意識。實際上,從性能角度來看,調用非成員函數實際上更快(不需要對此指針進行解引用)。

編輯:

迴應你的評論。如果函數只能使用幾個明確傳遞的參數來執行其作業,並且不需要任何內部狀態,則可能沒有理由聲明它具有成員函數。使用簡單的C風格函數調用並將參數傳遞給它。

+0

這正是我在這個問題上的觀點。因爲我覺得它實際上增加了代碼的可讀性,所以在你的本地範圍中不會出現任何魔術外部名字。很久以前,我被教過全局變量是非常糟糕的風格,訪問一個成員變量有時感覺就像使用全局變量。您正在訪問既不在本地範圍內,也不從外部作爲參數傳入的內容。 – Tom 2012-08-04 17:43:33

+1

@Tom - class memebers不是全球性的 - 他們故意明確地表示你正在使用的課程實例。你的課是一個小的,相關的國家的封裝。如果他們不是那麼你有更大的設計問題,不能像這樣修補。在你給的例子中,我會試圖讓你的實例不變。 – Flexo 2012-08-04 17:50:28

1

我理解這個問題,有過維護大班的代碼我沒有最初的作者。在C++中,我們有const關鍵字來幫助識別不改變狀態的方法:

void methodA() const; 

使用這有助於可維護性,因爲我們可以看到,如果一個方法可以改變對象的狀態。

在其他語言中沒有這個概念,我更喜歡清楚我是否通過既可以採用具有它通過在通過引用或返回的變化

this->mMemberVariable = this->someMethod(); 

改變實例變量的狀態而不是

void someMethod() 
{ 
    this->mMemberVariable = 1; // change object state but do so in non transparent way 
} 

我發現多年來,這使得維護更容易代碼。

相關問題