何时传递参数以及何时使用实例变量

时间:2008-12-06 10:30:08

标签: variables methods declaration

你们如何决定在本地跟踪某些东西,然后将其传递给你调用它的每个方法,或者声明一个实例变量并在方法中使用它?

我倾向于选择保存在Class末尾的列表中的实例变量。但是随着我的程序变得越来越复杂,这个列表变得越来越长......我认为如果某些东西经常通过,它应该只对所有需要它的男孩和女孩可见,但后来我开始疑惑, “为什么不把一切都公之于众呢?那么根本不需要传递任何东西!”

5 个答案:

答案 0 :(得分:46)

由于您指的是实例变量,我假设您使用的是面向对象的语言。在某种程度上,何时使用实例变量,如何定义其范围以及何时使用局部变量是主观的,但是在创建类时,您可以遵循一些经验法则。

  • 实例变量通常被视为类的属性。将这些变量视为将从您的类创建的对象的形容词。如果您的实例数据可用于帮助描述对象,那么可以安全地打赌它是实例数据的一个很好的选择。

  • 在方法范围内使用局部变量来帮助他们完成工作。通常,方法应该具有获取某些数据,返回某些数据和/或处理的目的。 /对某些数据运行算法。有时候,将局部变量视为帮助方法从头到尾的方法是有帮助的。

  • 实例变量范围不仅用于安全性,还用于封装。不要认为“目标应该是保持所有变量的私有性”。在继承的情况下,将变量设为受保护通常是一个很好的选择。您可以为需要访问外部世界的人创建getter / setter,而不是将所有实例数据公开。不要让它们全部可用 - 只有你需要的。这将贯穿整个开发生命周期 - 从开始就很难猜到。

当涉及到在类中传递数据时,很难说你正在做的是没有看到一些代码的好习惯。有时,直接在实例数据上操作很好;其他时候,事实并非如此。在我看来,这是经验带来的东西 - 随着面向对象的思维技能的提高,你会发展出一些直觉。

答案 1 :(得分:38)

主要取决于您存储在变量中的数据的生命周期。如果数据仅在计算期间使用,则将其作为参数传递。 如果数据绑定到对象的生命周期,则使用实例变量。

当你的变量列表太长时,考虑将类的某些部分重构为新类可能是一个好点。

答案 2 :(得分:15)

在我看来,实例变量只有在数据将在整个调用中使用时才是必需的。

以下是一个例子:

myCircle = myDrawing.drawCircle(center, radius);

现在让myDrawing类成像使用15个辅助函数来创建myCircle对象,每个函数都需要中心和半径。它们仍然不应被设置为myDrawing类的实例变量。因为永远不会再需要它们了。

另一方面,myCircle类需要将center和radius存储为实例变量。

myCircle.move(newCenter);
myCircle.resize(newRadius);

为了让myCircle对象在进行这些新调用时知道它的半径和中心是什么,它们需要存储为实例变量,而不仅仅是传递给需要它们的函数。

基本上,实例变量是一种保存对象“状态”的方法。如果不需要变量来知道对象的状态,那么它不应该是实例变量。

至于公开一切。它可能会让你的生活更轻松。但它会回来困扰你。皮斯没有。

答案 3 :(得分:4)

IMHO:

如果变量构成实例状态的一部分,那么它应该是一个实例变量 - classinstance HAS-A instancevariable。

如果我发现自己经常将某些东西传递给实例的方法,或者我发现我有大量的实例变量,我可能会尝试看看我的设计,以防我错过某些东西或在某处做了一个糟糕的抽象

希望有所帮助

答案 4 :(得分:3)

当然,在课堂上保留一大堆公共变量很容易。但即便如此,你可以说这不是可行的方法。

在使用它之前定义每个变量。如果变量支持特定方法的功能,则仅在方法范围内使用它。

另外考虑安全性,公共类变量容易受到“外部”代码的不必要更改。你的主要目标应该是保持所有变量都是私有的,而任何不变量的变量应该是非常充分的理由。

关于将参数一直传递到堆栈中,这可能会非常快速地变得难看。一个经验法则是保持您的方法签名干净和优雅。如果您看到许多方法使用相同的数据,请确定它是否足以成为类成员,如果不重要,则重构代码以使其更有意义。

归结为常识。仔细考虑你在哪里以及为什么宣布每个新变量,它的功能应该是什么,并从那里决定它应该适用于哪个范围。