直接访问成员变量或作为参数传递

Access member variables directly or pass as parameter?

本文关键字:参数传递 变量 访问 成员      更新时间:2023-10-16

我注意到,即使关注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; }
};

如果一个类有成员变量,请使用它们。如果要显式传递参数,请将其设为自由函数。传递成员变量不仅会使代码更加冗长,还会违背人们的期望,使代码难以理解。

类的全部目的是创建一组具有隐式传递共享状态的函数。如果这不是你想要做的,就不要使用类。

是的,这显然是一种糟糕的做法。从我的角度来看,将成员变量传递给成员函数根本没有意义。它有几个缺点:

  1. 降低代码可读性
  2. 在堆栈上复制参数的性能成本

最终将该方法转换为一个简单的函数,可能是有意义的。事实上,从性能的角度来看,对非成员函数的调用实际上更快(不需要取消引用该指针)。

编辑:

请回答您的评论。如果函数只能使用显式传递的几个参数来执行其工作,并且不需要任何内部状态,那么可能没有理由声明它有一个成员函数。使用一个简单的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
}

多年来,我发现这使得代码更容易维护。