直接访问成员变量或作为参数传递
Access member variables directly or pass as parameter?
我注意到,即使关注OOD的单一责任原则,有时类仍然会变大。有时,直接在方法中访问成员变量感觉像是具有全局状态,并且当前范围中存在很多东西。只需查看当前使用的方法,就不可能再确定当前范围中可访问的内部变量的来源。
最近,当我和一个朋友一起工作时,我意识到我写的代码比他详细得多,因为我仍然将成员变量作为参数传递到每个方法中。
这种做法不好吗?
编辑:示例:
class AddNumbers {
public:
int a, b;
// ...
int addNumbers {
// I could have called this without arguments like this:
// return internalAlgorithmAddNumbers();
// because the data needed to compute the result is in members.
return internalAlgorithmAddNumbers(a,b);
}
private:
int internalAlgorithmAddNumbers(int sum1, int sum2) { return sum1+sum2; }
};
如果一个类有成员变量,请使用它们。如果要显式传递参数,请将其设为自由函数。传递成员变量不仅会使代码更加冗长,还会违背人们的期望,使代码难以理解。
类的全部目的是创建一组具有隐式传递共享状态的函数。如果这不是你想要做的,就不要使用类。
是的,这显然是一种糟糕的做法。从我的角度来看,将成员变量传递给成员函数根本没有意义。它有几个缺点:
- 降低代码可读性
- 在堆栈上复制参数的性能成本
最终将该方法转换为一个简单的函数,可能是有意义的。事实上,从性能的角度来看,对非成员函数的调用实际上更快(不需要取消引用该指针)。
编辑:
请回答您的评论。如果函数只能使用显式传递的几个参数来执行其工作,并且不需要任何内部状态,那么可能没有理由声明它有一个成员函数。使用一个简单的C风格函数调用并将参数传递给它。
我理解这个问题,因为我不得不在我最初没有编写的代码中维护大型类。在C++中,我们有关键字const来帮助识别不改变状态的方法:
void methodA() const;
使用它有助于维护,因为我们可以看到一个方法是否可以更改对象的状态。
在其他没有这个概念的语言中,我更愿意明确我是通过引用传入实例变量还是返回更改来更改实例变量的状态
this->mMemberVariable = this->someMethod();
而不是
void someMethod()
{
this->mMemberVariable = 1; // change object state but do so in non transparent way
}
多年来,我发现这使得代码更容易维护。
相关文章:
- 如何将指针变量作为引用参数传递?
- 变量模板是否可以作为模板模板参数传递
- 是否可以将结构的成员变量作为参数传递
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 在 c++ 模板中将变量作为参数传递
- 是否可以将变量/函数返回作为模板参数传递
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 如何将变量作为构造函数参数或函数参数传递
- 让宏将迭代参数传递到通过宏变量提供的代码体中
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 当将变量作为函数参数传递时,由于隐式铸造而导致的精度丧失
- 如果结构作为递归函数中的参数传递,如何初始化结构的成员变量
- C 11-当我将局部变量作为参数传递到线程中时,它是否安全
- 如果我有一个将指针变量作为输入的函数,有没有办法将函数作为参数传递
- 为什么我无法访问作为参数传递到函数中的基类的受保护成员变量?
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 直接访问成员变量或作为参数传递
- 将变量作为模板参数传递