你们如何决定在本地跟踪某些东西,然后将其传递给你调用它的每个方法,或者声明一个实例变量并在方法中使用它?
我倾向于选择保存在类末尾的列表中的实例变量.但随着我的程序变得越来越复杂,这个列表变得越来越长......我认为,如果某些东西经常通过,它应该只对所有需要它的男孩和女孩可见,但后来我开始疑惑, "为什么不把一切都公之于众呢?那么根本不需要传递任何东西!"
既然你是指实例变量,我假设你是在使用面向对象的语言.在某种程度上,何时使用实例变量,如何定义其范围以及何时使用局部变量是主观的,但是在创建类时,您可以遵循一些经验法则.
实例变量通常被认为是类的属性.将这些视为将从您的班级创建的对象的形容词.如果你的实例数据可以用来帮助描述对象,那么打赌它是一个很好的选择实例数据可能是安全的.
局部变量在方法范围内使用,以帮助他们完成工作.通常,方法应该具有获取某些数据,返回某些数据和/或在某些数据上处理/运行算法的目的.有时候,将局部变量视为帮助方法从头到尾的方法是有帮助的.
实例变量范围不仅用于安全性,还用于封装.不要认为"目标应该是保持所有变量的私密性".在继承的情况下,将变量设置为受保护通常是一个很好的选择.您可以为需要访问外部世界的人创建getter/setter,而不是将所有实例数据公开.不要让它们全部可用 - 只有你需要的.这将在整个开发生命周期中出现 - 从开始就很难猜到.
当涉及到在一个类中传递数据时,很难说你正在做的是没有看到一些代码的好习惯.有时,直接在实例数据上操作很好; 其他时候,事实并非如此.在我看来,这是经验带来的东西 - 随着面向对象的思维技能的提高,你会发展出一些直觉.
这主要取决于您存储在变量中的数据的生命周期.如果数据仅在计算期间使用,则将其作为参数传递.如果数据绑定到对象的生命周期,则使用实例变量.
当你的变量列表太长时,考虑将类的某些部分重构为新类是一个好点.
在我看来,只有在跨越调用使用数据时才需要实例变量.
这是一个例子:
myCircle = myDrawing.drawCircle(center, radius);
现在让myDrawing类成像使用15个辅助函数来创建myCircle对象,每个函数都需要中心和半径.它们仍然不应被设置为myDrawing类的实例变量.因为永远不会再需要它们了.
另一方面,myCircle类需要将center和radius存储为实例变量.
myCircle.move(newCenter); myCircle.resize(newRadius);
为了让myCircle对象知道在进行这些新调用时它的半径和中心是什么,它们需要存储为实例变量,而不仅仅是传递给需要它们的函数.
所以基本上,实例变量是一种保存对象"状态"的方法.如果不需要变量来知道对象的状态,那么它不应该是实例变量.
至于把一切都公之于众.它可能会让你的生活更轻松.但它会回来困扰你.皮斯没有.