我在高中的第一个编程班。我们正在完成第一学期项目。这个项目只涉及一个类,但有很多方法。我的问题是实例变量和局部变量的最佳实践。似乎使用几乎只有实例变量进行编码会更容易。但是我不确定这是不是我应该这样做,或者我是否应该更多地使用局部变量(我只需要让方法更多地考虑局部变量的值)。
我的理由也是因为很多时候我想要一个方法返回两个或三个值,但这当然是不可能的。因此,简单地使用实例变量似乎更容易,因为它们在类中是通用的,所以不必担心。
答案 0 :(得分:34)
答案 1 :(得分:8)
当它是类的核心概念时使用实例变量。如果您正在迭代,递归或进行某些处理,那么请使用局部变量。
当您需要在相同位置使用两个(或更多)变量时,是时候创建一个具有这些属性的新类(以及设置它们的适当方法)。这将使您的代码更清晰,并帮助您思考问题(每个类都是您词汇表中的新术语)。
当一个变量是核心概念时,它可以成为一个类。例如真实世界的标识符:这些标识符可以表示为字符串,但通常,如果将它们封装到自己的对象中,它们会突然开始“吸引”功能(验证,与其他对象的关联等)
同样(不完全相关)是对象一致性 - 对象能够确保它的状态是有意义的。设置一个属性可能会改变另一个它还可以更容易地将程序更改为以后的线程安全(如果需要)。
答案 2 :(得分:4)
短篇小说:当且仅当一个变量需要被多个方法(或类外)访问时,才将其创建为实例变量。如果只需要在本地使用它,在单个方法中,它必须是局部变量。实例变量比局部变量更昂贵 请记住:实例变量初始化为默认值,而局部变量则不是。
答案 3 :(得分:3)
方法内部的局部变量总是首选,因为您希望保持每个变量的范围尽可能小。但是如果有多个方法需要访问变量,那么它必须是一个实例变量。
局部变量更像是用于达到结果或动态计算内容的中间值。实例变量更像是类的属性,例如您的年龄或名称。
答案 4 :(得分:2)
将变量声明为尽可能窄的范围。首先声明局部变量。如果这还不够,请使用实例变量。如果这还不够,请使用class(static)变量。
我需要返回多个值,返回复合结构,如数组或对象。
答案 5 :(得分:2)
简单方法:如果变量必须由多个方法共享,请使用实例变量,否则使用局部变量。
但是,良好的做法是尽可能使用更多的局部变量。为什么?对于只有一个类的简单项目,没有区别。对于包含大量课程的项目,存在很大差异。实例变量指示您的类的状态。类中的实例变量越多,该类可以拥有的状态就越多,然后,这个类就越复杂,维护类的难度就越大,或者项目可能出错的程度就越大。因此,良好的做法是使用尽可能多的局部变量来保持类的状态尽可能简单。
答案 6 :(得分:1)
尝试根据对象考虑您的问题。每个类代表不同类型的对象。实例变量是类需要记住以便与其自身或与其他对象一起工作的数据片段。局部变量应该只使用中间计算,一旦离开方法就不需要保存的数据。
答案 7 :(得分:1)
尽量不要从方法中返回多个值。如果你不能,在某些情况下你真的不能,那么我建议将它封装在一个类中。在最后一种情况下,我建议更改类中的另一个变量(实例变量)。实例变量方法的问题在于它增加了副作用 - 例如,您在程序中调用方法A并且它修改了一些实例变量(s)。随着时间的推移,这会导致代码的复杂性增加,维护变得越来越难。
当我必须使用实例变量时,我尝试在类构造函数中进行final然后初始化,以便最小化副作用。这种编程风格(最小化应用程序中的状态更改)应该会产生更易于维护的更好的代码。
答案 8 :(得分:0)
通常变量应该具有最小范围。
不幸的是,为了构建具有最小化变量范围的类,通常需要进行大量的方法参数传递。
但如果你一直遵循这个建议,完全最小化变量范围,你 最终可能会有很多冗余和方法不灵活,所有必需的对象都传入和传出方法。
使用以下数千种方法描绘代码库:
private ClassThatHoldsReturnInfo foo(OneReallyBigClassThatHoldsCertainThings big,
AnotherClassThatDoesLittle little) {
LocalClassObjectJustUsedHere here;
...
}
private ClassThatHoldsReturnInfo bar(OneMediumSizedClassThatHoldsCertainThings medium,
AnotherClassThatDoesLittle little) {
...
}
另一方面,想象一下代码库中有很多像这样的实例变量:
private OneReallyBigClassThatHoldsCertainThings big;
private OneMediumSizedClassThatHoldsCertainThings medium;
private AnotherClassThatDoesLittle little;
private ClassThatHoldsReturnInfo ret;
private void foo() {
LocalClassObjectJustUsedHere here;
....
}
private void bar() {
....
}
随着代码的增加,第一种方法可能最大限度地减少变量范围,但很容易导致传递大量方法参数。代码通常会更冗长,这会导致复杂性,因为重构所有这些方法。
使用更多的实例变量可以降低传递的大量方法参数的复杂性,并且当您经常重新组织方法时可以为方法提供灵活性。但它会创建更多您必须维护的对象状态。一般来说,建议是做前者而不是后者。
然而,经常,并且它可能取决于人,与第一种情况的数千个额外对象引用相比,可以更容易地管理状态复杂性。当方法中的业务逻辑增加并且组织需要改变以保持秩序和清晰度时,人们可能会注意到这一点。
不仅如此。当您重新组织方法以保持清晰度并在过程中进行大量方法参数更改时,最终会出现许多版本控制差异,这对于稳定的生产质量代码来说并不是那么好。有一个平衡。一种方式导致一种复杂性。另一种方式导致另一种复杂性。
使用最适合您的方式。随着时间的推移你会找到平衡。
我认为这位年轻的程序员对低维护代码有一些富有洞察力的第一印象。
答案 9 :(得分:0)
时使用实例变量
类似地,当这些条件都不匹配时使用局部变量,特别是在弹出堆栈后变量的作用将结束。例如:Comparator.compare(o1,o2);