6

最近我感觉实例变量和全局变量有同样的问题,我用谷歌搜索了一下,发现这篇旧文章或多或少地描述了我看到的潜在问题。

您使用什么好的做法来避免全局变量的相同问题影响实例变量或类变量?

4

3 回答 3

2

类比全局结构小得多,因此实例变量的影响要小得多。通过保持较小的班级规模并严格遵守单一职责原则,可以避免全局变量的大部分缺点。如果实例变量是从传入的参数创建的,那么我经常在构造函数中使该参数成为必需的,从而显式地显示依赖关系。实例变量也被很好地封装,永远不会在实例的方法之外直接修改,这使得很容易确定实例变量的修改位置。最后,实例变量必须对整个类有意义或必须是私有的。

于 2012-07-14T00:28:09.583 回答
0

实例变量只能在特定类中访问。因此,为了防止实例变量被过度使用,请保持小类。如果一个类变大,决定它的某些部分是否可以重构为另一个更小的类,原始类使用。

于 2012-07-14T00:24:55.307 回答
0

实例变量、全局变量或任何类型的变量都没有“问题”……它们都是工具。问题是有时很多程序员选择使用“错误的工具”。你必须仔细考虑你的选择意味着什么,这样你才能做出正确的选择。

为某事使用全局变量,例如 CurrentUserName... 意味着您说他 CurrentUserName 是众所周知的。并且每次“只能有一个” CurrentUserName 。如果您想允许用户同时登录,那可能是错误的(除非您真的很幸运,并且两个用户的名字相同)...

实例变量的一个真正错误使用是如果您将用户的电子邮件地址作为实例变量,然后您会意识到每个用户可以有多个电子邮件地址。

我还会举一个继承的例子,因为我认为它会更清楚:一个与继承相关的问题是,例如,如果你正在对典型的学生、教师问题进行建模,并且你尝试让 Student 成为 Person 的子类和教师 Person 的子类。然后你意识到有些人可能两者兼而有之……

从 Person 继承的 Student 是一种静态关系,在运行时无法更改。而且学生和老师不是静态的关系......一个人可以两者都不是,然后开始成为学生,然后开始成为老师,然后停止成为两者,但它始终是同一个人,并且那个型号处理不了。。。。

回到用户,该用户与多个电子邮件帐户“关联”...如果您放置一个实例变量,则说明他只是与单个电子邮件帐户“关联”,而您与您的问题域,这就是为什么你会有问题......

如果您说只有一个全球已知的当前用户名,这同样适用....

在所有情况下,问题都是您有一个问题域,并且您对其建模是错误的……您必须使您的程序和模型的行为与问题域相似……如果您不这样做,您将遇到问题,无论您选择哪种工具来解决您的问题。

顺便说一句:我也认为拥有电子邮件地址列表的用户是错误的,但这是出于完全不同的动机。我实际上会使用

class ContactInformation
{
    User contact;
    EMailAddress email;
}

并记住对象不“拥有”或“拥有”其他对象......这是一个实现决定......对象只是“知道”其他对象......

于 2012-07-14T00:32:55.477 回答