簡體   English   中英

通過構造函數與公共方法傳遞參數

[英]Passing parameter through constructor vs public methods

我聽到我的朋友關於參數傳遞,何時通過構造函數傳遞輸入以及何時通過公共方法傳遞參數的爭論不休?

第一種情況,在構造函數中初始化公共方法的所有參數。 爭論:如果函數的參數數量比玩具示例大得多,它將看起來更加整潔。 反對這一觀點:在某些用例中,我只需要調用僅依賴於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;
};

另一個問題是,如果將類限制為僅具有一個公共方法,則第一種情況或第二種情況是否被視為更好的做法?

您的判斷均不符合真正的IMO。 如果它是類表示的對象的組成部分,則使其成為成員變量。 假設您正在制作Car類。 然后enginegearboxbrake等將所有成員變量,即使你使用enginegearboxSpeedUp()brakeSlowDown()

因此,在您的情況下,如果a1a2確實屬於A ,那么將它們聲明為成員變量而不是顯式傳遞給函數絕對是一個不錯的選擇。

希望你明白我的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM