2012-03-12 30 views
2

正如標題所示:創建函數來訪問類變量是否是一種好的做法?創建函數來訪問類變量是不是很好的做法?

我見過不少的代碼塊做類似如下的:

class MyClass { 
public: 
void setx(int a); 
void sety(int b); 
int read_x; 
int read_y; 

private: 
int x; 
int y; 

}; 

void MyClass::setx(int a) { 
x=a; 
} 

void MyClass::sety(int b) { 
y = b; 
} 

int MyClass::read_x() { 
return x; 
{ 

int MyClass::read_y() { 
return y; 
} 

因此而不是訪問變量直接(MyClass.x),他們使用函數讀取和設置變量值等。

這是一個標準或良好做法?

回答

4

是的,訪問者函數被優先指導成員訪問的原因有幾個。它們提供了一個獨特的接入點,更容易跟蹤和調試。

例如,您可以在MyClass::setX()中設置單個斷點,而不是在其中MyClass.x被更改的代碼中的任何地方設置斷點。

但是,雖然比直接成員訪問更好,但訪問器方法不是沒有缺點,如果濫用。有關詳細信息,您可以訪問Getters and Setters are bad OO design?

+1

是的,訪問器也減少了接口(公共方法)和實現(私有領域)之間的耦合。 – 2012-03-12 23:49:36

+0

有一個例外(國際海事組織):如果你有一個變量,你知道永遠不需要警衛,這是一個簡單的類型,然後繼續,只是公開。添加函數來獲取/設置它只是代碼膨脹。 – 2012-03-12 23:49:46

+0

@EdS .:爲了保持一致性,我添加了一個簡單的訪問器,它返回一個非''cont'參考,所以訪問保持不變。 – Xeo 2012-03-12 23:53:03

1

是的,他們都可以,但是我也會說,你應該保持你的班級比你說的Java小,而不是你最終不會以類型爲主的getter和制定者。

通常,一個類擁有一個(理想情況下是單個)狀態(如果需要可以獲得),並且具有理想情況下應該保持私有的實現。

2

而不是直接訪問變量?絕對。創建一個編程接口層將您從這些內部變量本身的實現細節中分離出來。然後你爲自己提供了額外的靈活性,比如創建有問題的類的模擬實現(用於測試),創建代理類(用於裝飾功能,如日誌記錄等)

我會警告不要自動創建所有你可能不需要它們的地方。但這是一個不同的問題。

就像在健身房鍛鍊:這還給超過它需要;)

1

這是重要的,因爲它的類從底層數據模型的界面分離。您經常會看到像您發佈的示例這樣的基本代碼,並且起初很多代碼看起來像是不必要的複雜因素。但是,它提供了一個(自我記錄)框架,可以在不破壞通過定義的接口訪問類的對象的代碼的情況下更改對象的實現。

+0

絕對。很難解釋它有多重要,直到你發現自己沒有做過幾千行;) – 2012-03-13 00:28:31

相關問題