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

你们如何决定在本地跟踪什么,然后把它传递给你调用的每一个方法,或者声明一个实例variables,并在方法中使用它?

我倾向于喜欢保存在类末尾的列表中的实例variables。 但是随着我的程序变得越来越复杂,这个列表变得越来越长……我想,如果事情经常得到通过,所有需要它的男孩和女孩都应该可以看到,但是我开始想, “为什么不把所有的东西都公之于众呢,那么就再也不需要任何东西了!”

既然你指的是实例variables,我假设你正在使用面向对象的语言。 在某种程度上,何时使用实例variables,如何定义它们的范围以及何时使用局部variables是主观的,但是在创build类时可以遵循一些经验法则。

  • 实例variables通常被认为是一个类的属性。 把这些看作是你class上创build的对象的形容词。 如果您的实例数据可以用来帮助描述对象,那么将实例数据作为一个好的select可能是安全的。

  • 在方法范围内使用局部variables来帮助他们完成工作。 通常情况下,一个方法的目的应该是获取一些数据,返回一些数据,和/或在某些数据上运行/运行一个algorithm。 有时候,将局部variables看作帮助方法从头到尾的方法是有帮助的。

  • 实例variables作用域不仅仅是为了安全性,而且也是为了封装。 不要认为“目标应该是保持所有variables的私密性”。 在inheritance的情况下,使variables保护通常是一个很好的select。 而不是公开所有实例数据,而是为需要访问外部世界的人创buildgetters / setters。 不要让他们都可用 – 只有你需要的。 这将贯穿整个开发生命周期 – 从开始就很难猜测。

当涉及到在一个类中传递数据时,很难说没有看到一些代码就是在做什么是好的做法。 有时,直接在实例数据上操作是没有问题的; 其他时候,不是。 在我看来,这是有经验的东西 – 随着面向对象的思维能力的提高,你会发展出一些直觉。

主要取决于你存储在variables中的数据的生命周期。 如果数据仅在计算过程中使用,则将其作为parameter passing。 如果数据绑定到对象的生命周期,则使用实例variables。

当你的variables列表变得太长时,也许考虑将类的某些部分重构成一个新的类是个好主意。

在我看来,实例variables只有在数据将被用于不同的调用时才是必需的。

这是一个例子:

myCircle = myDrawing.drawCircle(center, radius); 

现在,让myDrawing类成像使用15个帮助函数来创buildmyCircle对象,每个函数都需要中心和半径。 他们仍然不应该被设置为myDrawing类的实例variables。 因为他们永远不会再被需要。

另一方面,myCircle类将需要存储中心和半径作为实例variables。

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

为了让myCircle对象知道什么是半径和中心,当这些新的调用被创build时,他们需要被存储为实例variables,而不仅仅是传递给需要它们的函数。

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

至于让一切公开。 这可能会让你的生活更轻松。 但它会回来困扰你。 Pease不要。

恕我直言:

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

如果我发现自己反复将某些东西传递给实例的方法,或者我发现有大量的实例variables,那么我可能会试着看看我的devise,以防万一我错过了一些东西或者在某个地方做出了糟糕的抽象。

希望能帮助到你

当然,在课堂上保留一大堆的公共variables是很容易的。 但即使直觉上,你也可以说这不是要走的路。

在打算使用它之前定义每个variables。 如果一个variables支持某个特定方法的function,那么只能在该方法的范围内使用它。

另外考虑安全性,公开类variables容易受到“外部”代码的不希望的改变。 你的主要目标应该是保持所有的variables是私有的,任何不是的variables都应该有一个很好的理由。

关于将parameter passing给堆栈,这会变得非常快。 经验法则是保持您的方法签名清洁和优雅。 如果你看到许多方法使用相同的数据,那么决定是否足够重要,如果不是,重构你的代码使其更有意义。

归结为常识。 仔细想想你在哪里以及为什么要声明每个新variables,它的function应该是什么,然后从那里做出关于它应该在哪个范围内生存的决定。