访问成员变量直接或者通过作为参数?(Access member variables directly

2019-07-30 18:49发布

我注意到,参拜OOD的单一职责原则,即使有时阶级还在变大。 有时直接的方法访问成员变量感觉就像有全局状态,很多东西在当前范围存在。 只要看一眼的方法目前在工作,这是不可能的了,以确定在当前范围内来自到达者invidiual变量。

当一个朋友最近一起工作,我才意识到我写的比他更冗长的代码,因为我通过成员变量仍参数为每个单独的方法。

这是不好的做法?

编辑:例如:

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; }
};

Answer 1:

如果一个类成员变量,使用它们。 如果你想明确地传递参数,使它成为一个自由的功能。 绕过不仅成员变量使得代码更详细的,也违反了人们的预期,使代码难以理解。

一类的整个目的是创建具有隐式传递共享状态的一组功能。 如果这不是你想要做什么,不使用类。



Answer 2:

是的,definetely一个不好的做法。 传递一个成员变量成员函数已经没有任何意义,从我的观点。 它有几个缺点:

  1. 减少代码的可读性
  2. 成本的长期演出的参数复制到堆栈

该方法最终转化为简单的功能,可具有感。 事实上,从性能来看,来电非成员函数实际上是更快(不需要解引用这个指针)。

编辑:

回答您的评论。 如果函数可以执行其作业只用明确地传递了几个参数,并且不需要任何的内部状态,可能比没有理由宣布它有一个成员函数。 用一个简单的C风格的函数调用和参数传递给它。



Answer 3:

我理解这个问题,有过维护大班的代码我没有最初的作者。 在C ++中,我们有const关键字来帮助识别不改变状态的方法:

void methodA() const;

这有助于使用可维护性,因为我们可以看到,如果一个方法可以改变对象的状态。

在没有这个概念,我更喜欢清楚我是否通过既可以采用具有它通过在通过引用或返回的变化来改变实例变量的状态,其他语言

this->mMemberVariable = this->someMethod();

而不是

void someMethod()
{
   this->mMemberVariable = 1; // change object state but do so in non transparent way
}

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



文章来源: Access member variables directly or pass as parameter?