【问题标题】:Passing parameter through constructor vs public methods通过构造函数与公共方法传递参数
【发布时间】:2016-03-20 17:04:29
【问题描述】:

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

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

另一个问题是,如果该类被限制为只有一个公共方法,那么第一种情况还是第二种情况被认为是更好的做法?

【问题讨论】:

  • 如果您的参数成为私有成员是有效的,我看不出如何将其设为函数参数不会破坏程序。
  • 在我看来,A 本来就没有作为一个班级的事,A 到底是做什么的?

标签: c++ function oop constructor


【解决方案1】:

您的任何判断都不符合 IMO。如果它是类表示的对象的一个​​组成部分,则使其成为成员变量。假设您正在上课 Car。然后enginegearboxbrake 等将是所有成员变量,即使您将在SpeedUp() 中使用enginegearbox,在SlowDown() 中使用brake

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

希望你明白我的意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多