Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 何时使用对象实例变量,而不是将参数传递给方法_Variables_Methods_Parameter Passing_Declaration - Fatal编程技术网

Variables 何时使用对象实例变量,而不是将参数传递给方法

Variables 何时使用对象实例变量,而不是将参数传递给方法,variables,methods,parameter-passing,declaration,Variables,Methods,Parameter Passing,Declaration,您如何决定是将参数传递给一个方法,还是简单地将它们声明为对象实例变量,这些变量对对象的所有方法都是可见的 我更喜欢将实例变量保存在类末尾的列表中,但随着程序的增长,这个列表会越来越长。我想如果一个变量被传递的次数足够多,那么它应该对所有需要它的方法都是可见的,但是我想,“如果所有的东西都是公共的,那么就根本不需要传递任何东西了!”这主要取决于存储在变量中的数据的生存期。如果数据仅在计算过程中使用,请将其作为参数传递。 如果数据绑定到对象的生存期,请使用实例变量 当变量列表过长时,考虑将类的某些部

您如何决定是将参数传递给一个方法,还是简单地将它们声明为对象实例变量,这些变量对对象的所有方法都是可见的


我更喜欢将实例变量保存在类末尾的列表中,但随着程序的增长,这个列表会越来越长。我想如果一个变量被传递的次数足够多,那么它应该对所有需要它的方法都是可见的,但是我想,“如果所有的东西都是公共的,那么就根本不需要传递任何东西了!”

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


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

当然,在类中保留一个大的公共变量列表很容易。但即使凭直觉,你也可以看出这不是一条路

在使用之前定义每个变量。如果变量支持特定方法的函数,请仅在该方法的范围内使用它

还要考虑安全性,公共类变量容易受到来自“外部”代码的不必要更改的影响。你的主要目标应该是保持所有变量的私有性,任何非私有的变量都应该有一个很好的理由

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

这归结为常识。准确地思考每个新变量的声明位置和原因,它的函数应该是什么,并从中决定它应该在哪个范围内。

IMHO:

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

如果我发现自己在实例的方法中重复传递了一些东西,或者我发现我有大量的实例变量,我可能会尝试查看我的设计,以防我遗漏了一些东西或者在某个地方做了一个糟糕的抽象


希望对您有所帮助

因为您指的是实例变量,所以我假设您使用的是面向对象的语言。在某种程度上,何时使用实例变量、如何定义它们的作用域以及何时使用局部变量都是主观的,但在创建类时,您可以遵循一些经验法则

  • 实例变量通常被视为类的属性。将它们视为将从类中创建的对象的形容词。如果您的实例数据可以用来帮助描述对象,那么可以肯定它是实例数据的一个好选择

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

  • 实例变量作用域不仅仅是为了安全,也是为了封装。不要假设“目标应该是保持所有变量私有”。在继承的情况下,将变量设置为受保护的通常是一个很好的选择。不是将所有实例数据标记为公共的,而是为那些需要访问外部世界的数据创建getter/setter。不要让它们都可用——只提供你需要的。这将贯穿整个开发生命周期——很难从一开始就猜到


当涉及到在类中传递数据时,如果没有看到一些代码,很难说您所做的是良好的实践。有时,直接对实例数据进行操作是很好的;其他时候,情况并非如此。在我看来,这是经验带来的——随着面向对象思维技能的提高,你会发展出一些直觉。

在我看来,实例变量只有在跨调用使用数据时才是必要的

下面是一个例子:

myCircle = myDrawing.drawCircle(center, radius);
现在让我们成像myDrawing类使用15个辅助函数来创建myCircle对象,其中每个函数都需要中心和半径。它们仍然不应设置为myDrawing类的实例变量。因为他们再也不需要了

另一方面,myCircle类需要将圆心和半径存储为实例变量

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

所以基本上,实例变量是保存对象“状态”的一种方法。如果变量不是了解对象状态所必需的,那么它不应该是实例变量


至于公开一切。这可能会让你现在的生活更轻松。但它会回来缠着你。请不要这样做。

如果您有一个具体的例子,您可能会得到更直接有用的答案。我的答案是将此答案添加到H-Man2答案(终身)中。当且仅当它是对象的持久状态时,它才应该是成员属性。也就是说,该值本身在当前方法堆栈的范围之外是有意义的。我的直觉反应是同意David和H-MAn2。然而,我正在阅读Robert c Martin的“clean code”,在第3章中,他重构代码,将某些内容从方法参数移动到成员变量,因为拥有大量参数是b