好的,这可能是基本的,但我希望程序员对此有好的意见。
在小类文件中处理变量的好方法是什么?
我喜欢模块化方法并保留完成特定事物的方法。 我最终在这些方法之间传递变量。将许多方法中使用的变量作为成员变量使用是一种好习惯吗?或者将变量传递给方法更好?
例如:
class Test{
somefunction(int a, int b, int c, int d) {
doSomething(a, b, c);
doOneMoreThing(a, c, d);
}
void doSomething(int a, int b, int c) { }
void doOneMoreThing(int a, int c, int d) { }
}
在上面的例子中,您认为变量应该保留为成员变量吗? 请解释为什么一种方法优先于另一种方法。
答案 0 :(得分:3)
您是否需要在方法调用之间保留变量,并重用它们的值?如果是这样,他们应该是班级成员。 (至少在一些类 - 不一定是这个。)
否则这有点像味道。一个重要的因素是局部变量不会向对象添加状态,如果同时使用它会很有用。保持所有变量本地甚至可以让你使你的类不可变,这通常使它自动线程安全。但即使在单线程环境中,不可变类也更容易理解和维护。
OTOH传递大量参数可能很尴尬。您可以考虑introducing a Parameter Object来缓解此问题。答案 1 :(得分:2)
如果我有一些变量,我最终会传递给一堆私有方法,我会经常将它们移到一个私有的内部工人类中。
而不是
class Foo {
public doSomething(...) {
// some setup
doSomethingRecursively(a, b, c);
}
private void doSomethingRecursively(A a, B b, C c) {
if (baseCase) { ... }
doSomethingRecursively(a + 1, b, c);
}
}
我会将那些永远不同的变量移动到工人的属性中。
class Foo {
public doSomething(...) {
// some setup
new AppropriatelyNamedHelper(b, c).doSomethingRecursively(a);
}
private static final class AppropriatelyNamedHelper {
final B b;
final C c;
AppropriatelyNamedHelper(B b, C c) {
this.b = b;
this.c = c;
}
void doSomethingRecursively(A a) {
if (baseCase) { ... }
doSomethingRecursively(a + 1);
}
}
}
这使审稿人清楚地知道每个范围内的内容在该范围内是不变的。
答案 2 :(得分:2)
成员变量应该存在以保持类中的某种状态。如果您的类维护状态,那么明确定义您需要跟踪的事物的成员变量。如果一个类没有维护状态,那么没有理由让成员成员(我必须调试遗留代码,其中变量不应该成为成员但是当它对对象进行多次调用时它会导致错误,因为状态是不可预测的)。
然而,虽然您可能喜欢“模块化”功能,但请阅读耦合与内聚。在类中具有太多功能但具有较少的依赖性并且具有非常少但高度特定的功能和大量依赖性之间存在平衡。
答案 3 :(得分:1)
拥有无用的成员变量通常被视为糟糕的设计。 但是,如果在许多方法中使用这些变量,则可以(并且应该)将多个变量集合并到一个新类中。
答案 4 :(得分:1)
如果您不关心对象的状态,那么将变量传递给方法就可以了。在这种情况下,我会在方法上使用static
修饰符,然后您不必实例化该类,您可以像这样调用该方法:
Test.doSomething(1, 2, 3);
答案 5 :(得分:1)
如果要重用变量,则可以将它们声明为类变量。如果没有,那么它们应该是各自方法中定义的局部变量。
答案 6 :(得分:0)
首先Somefunction(... }
是语法错误。其次,方法名称应以小写字母开头,类名称应以大写字母开头。第三,我们不知道最好的方法是什么,不知道这些方法做什么,它们用于什么,以及它们的参数来自哪里
答案 7 :(得分:0)
取决于您更改代码的频率(或者您应该考虑在设计代码时更改频率的频率)。如果签名发生变化,您必须在很多地方进行更改。这意味着即使重构签名,也需要测试更多代码。我会错误地创建成员变量和封装。