2015-12-15 167 views
0

我聽到朋友們關於參數傳遞,何時通過構造函數傳遞輸入以及何時通過公共方法的衝突?通過構造函數傳遞參數vs公共方法

第一種情況,公共方法的所有參數在構造函數中初始化。對此的爭論:如果函數的參數數量比玩具例子大很多,它將看起來更清晰。對此的論點:在某些使用情況下,我只需要調用僅依賴於a1的func1,需要初始化a2創建不必要的耦合。不立即清楚每個功能所依賴的輸入。

class A 
{ 
public: 
    A(int a1, int a2) : m_a1(a1), m_a2(a2) {}; 
    func1(){ //do something with m_a1 }; 
    func2(){ //do something with m_a1, m_a2 }; 
private: 
    int m_a1; 
    int m_a2; 
}; 

第二種情況,沒有什麼是在構造函數中初始化的。對此的論點:立即清楚函數依賴於哪些輸入,並且沒有不必要的耦合。對此的爭論:這只是一個函數集合,爲什麼要在第一個地方使用類?如果代碼中有更多的函數和參數,代碼將被重複的相似參數混淆。

class A 
{ 
public: 
    func1(int a1){ //do something with a1 }; 
    func2(int a1, int a2){ //do something with a1, a2 }; 
}; 

第三種情況,只有公共方法在構造函數中初始化的通用參數。看起來雙方都是最好的,但雙方都有缺點。

class A 
{ 
public: 
    A(int a1) : m_a1(a1) {}; 
    func1(){ //do something with m_a1 }; 
    func2(int m_a2){ //do something with m_a1, a2 }; 
private: 
    int m_a1; 
}; 

另一個問題是,如果類是僅限於有一個單一的公共方法,是第一個場景或認爲是更好的做法,第二個場景?

+0

如果你的參數是一個私人成員是有效的,我不明白如何使它成爲一個函數參數不會破壞程序。 –

+0

聽起來對於我來說,'A'首先沒有業務上課,'A'完全是做什麼的? – user657267

回答

0

您的判斷都不是真正的IMO。如果它是該類表示的對象的組成部分,則將其設爲成員變量。假設你正在創建一個類Car。然後enginegearboxbrake等將所有成員變量,即使你在SlowDown()使用SpeedUp()enginegearbox,和brake

所以你的情況,如果a1a2真正屬於A,它絕對是一個不錯的選擇,它們聲明爲成員變量,而不是傳遞到功能明確。

希望你明白了我的觀點。