通过构造函数与公共方法传递参数
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;
};
另外一个问题是,如果类被限制为只有一个公共方法,那么第一个场景还是第二个场景被认为是更好的实践?
您的判断都不成立。如果它是类表示的对象的组成部分,则将其作为成员变量。假设您正在创建一个类Car
。那么engine
、gearbox
、brake
等都将是成员变量,即使您将在SpeedUp()
中使用engine
和gearbox
,在SlowDown()
中使用brake
。
因此,在您的情况下,如果a1
和a2
真的属于A
,那么将它们声明为成员变量而不是显式传递给函数绝对是一个不错的选择。
希望你明白我的意思。
相关文章:
- c++方法参数只能在linux的发布模式下自行更改
- 使用移动语义:右值引用作为方法参数
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 将方法参数类型更改为子类中的派生类
- ofstream作为C 中的方法参数
- 使用 gmock 匹配器将 std::function 设置为 EXPECT_CALL 中的方法参数
- C com 方法参数扣除
- 获取非静态方法参数计数
- 使用 gmock 返回模拟方法参数
- 运行 QML 时出现"未知方法参数类型"错误
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- 将C 方法参数转换为模板参数会因编译错误而失败
- 如何在方法参数中使用boost :: asio :: buffer
- qsharedPointer作为方法参数或方法的返回值的良好实践
- 如何将方法指针声明为Typedef方法参数
- 方法参数中的 OpenCV 垫"预期")""
- 方法参数中的 consst* 常量
- 带有“class”详细类型说明符的方法参数
- 具有原始方法参数派生类的 C++ 重载方法参数
- C++ std::string length() 或 size() 不适用于方法参数