12

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

3 回答 3

6

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

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

于 2012-08-04T17:35:39.537 回答
3

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

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

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

编辑:

回答您的评论。如果函数可以仅使用几个显式传递的参数来执行其工作,并且不需要任何内部状态,那么可能没有理由声明它具有成员函数。使用简单的 C 风格函数调用并将参数传递给它。

于 2012-08-04T17:38:25.197 回答
2

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

void methodA() const;

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

在其他没有这个概念的语言中,我更愿意通过引用传递或返回更改来明确我是否正在更改实例变量的状态

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

而不是

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

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

于 2014-10-12T15:20:23.373 回答