Answers:
取决于您是在procedural
还是functional
范式中编程。前者需要可变状态,而后者则需要削弱。这是苹果和橘子。他们在bailiwicks上都是正确的!
您可以将单一分配和其他功能技术应用于命令式过程语言,不可变状态使并发编程更具确定性,但是几乎不可能使每个对象都像Java或C ++这样不可变,因为它们的内存模型不容易支持这种范例。
如果我理解您的问题是对的,那么您正在质疑哪些条件可以使用参数或使用类变量/成员/字段/等?我假设您指的是方法,而不是函数。如果这是专门针对C ++的,我建议将您的问题移至堆栈溢出。
较长的参数列表可能表明您可能需要将您的方法重构为一组更精细的方法。通常,使用参数将使您的代码更松散地耦合。我不确定现在是否适用于大多数现代OO语言,但是对象创建会很昂贵,尤其是在涉及许多类变量的情况下;因此,如果您的类变量是对象并且在程序中经常被引用,则它们可能被证明是类变量。
也:
不,状态变量本身不会引起副作用。
调用setter方法(在其他位置可见的数据结构上)是一种副作用。
您可以使用数据结构来隐藏长参数列表和ansd,但如果相应地构造它们,则可以避免副作用。这是一个小示例(在Java中,未经测试):
class ManyParams {
final String theName = null;
final int theAge = 0:
ManyParams() {}
ManyParams(String a, int b) { theName=a; theAge = b; }
public withName(String n) {
return new ManyParams(n, this.theAge);
}
public withAge(int i) {
return new ManyParams(theName, i);
}
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));
当然,ManyParams的构造函数仍然会以这种方式包含较长的参数列表。但是它是隐藏的。