通过构造函数与公共方法传递参数

Passing parameter through constructor vs public methods

本文关键字:方法 参数 构造函数      更新时间:2023-10-16

我从朋友那里听到了关于参数传递、何时通过构造函数传递输入以及何时通过公共方法传递输入的矛盾争论?

第一个场景,在构造函数中初始化公共方法的所有参数。对此的论点是:如果函数的参数数量比玩具示例大得多,那么它看起来会干净得多。反对这一点的论点是:在某些用例中,我只需要调用仅依赖于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;
};

另外一个问题是,如果类被限制为只有一个公共方法,那么第一个场景还是第二个场景被认为是更好的实践?

您的判断都不成立。如果它是类表示的对象的组成部分,则将其作为成员变量。假设您正在创建一个类Car。那么enginegearboxbrake等都将是成员变量,即使您将在SpeedUp()中使用enginegearbox,在SlowDown()中使用brake

因此,在您的情况下,如果a1a2真的属于A,那么将它们声明为成员变量而不是显式传递给函数绝对是一个不错的选择。

希望你明白我的意思。