2012-08-04 128 views
10

我注意到,即使在遵守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

如果你的课程太大,将它们分开。如果你有一个成员变量使用它。如果你在一个方法中没有使用成员变量,它应该是'static',但这样做听起来很奇怪。 – Flexo 2012-08-04 17:29:08

+1

不好意思,我的英文似乎有点小问题。你传递成员变量作为参数?公共成员变量?或者这些成员变量的新值?我有点困惑。 – ATaylor 2012-08-04 17:29:44

+0

对不起,我不明确。在实现算法时,我通常会重新迭代它在方法签名中使用的参数,但算法需要的数据实际上可以直接从成员变量中拉取。让我们假设你有一个类,它添加了两个数字,并且有两个数字a和b作为成员变量。然后,而不是具有零参数的私人添加方法,我仍然会定义一个采用2个int参数的函数。像这样,我以后可以在课堂外重复使用该算法。 – Tom 2012-08-04 17:32:29

回答

5

如果一个类成员变量,使用它们。如果你想明确地传递参数,使它成为一个自由函数。通过传递成员变量不仅使代码更加冗长,还违反了人们的期望并使代码难以理解。

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

2

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

  1. 减少代码可读性
  2. 成本中的表演术语的参数复制堆栈

该方法最终转化为简单的功能上,可有意识。实际上,从性能角度来看,调用非成员函数实际上更快(不需要对此指针进行解引用)。

编辑:

回应你的评论。如果函数只能使用几个明确传递的参数来执行其作业,并且不需要任何内部状态,则可能没有理由声明它具有成员函数。使用简单的C风格函数调用并将参数传递给它。

+0

这正是我在这个问题上的观点。因为我觉得它实际上增加了代码的可读性,所以在你的本地范围中不会出现任何魔术外部名字。很久以前,我被教过全局变量是非常糟糕的风格,访问一个成员变量有时感觉就像使用全局变量。您正在访问既不在本地范围内,也不从外部作为参数传入的内容。 – Tom 2012-08-04 17:43:33

+1

@Tom - class memebers不是全球性的 - 他们故意明确地表示你正在使用的课程实例。你的课是一个小的,相关的国家的封装。如果他们不是那么你有更大的设计问题,不能像这样修补。在你给的例子中,我会试图让你的实例不变。 – Flexo 2012-08-04 17:50:28

1

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

void methodA() const; 

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

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

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

改变实例变量的状态而不是

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

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

相关问题