实例变量是新的全局变量吗?

时间:2012-07-14 00:20:06

标签: oop

最近我感觉实例变量具有相同的全局变量问题,我搜索了这一点并发现this old article或多或少地描述了我所看到的潜在问题。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

实例变量只能在特定类中访问。因此,为了防止实例变量被广泛使用,请保持较小的类。如果一个类变大,请确定它的哪些部分可以重构为原始类使用的另一个较小的类。

答案 2 :(得分:0)

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

对某些东西使用全局变量,比如CurrentUserName ...意味着你说他的CurrentUserName是普遍知道的东西。而且“每次只能有一个”CurrentUserName。如果你想让用户同时登录(除非你真的很幸运,并且两个用户都有相同的名字),这可能会是假的......

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

我还举一个继承的例子,因为我认为它会更清楚: 与继承相关的问题是,例如,如果您正在为典型的学生,教师问题建模,并且您尝试将Person和Person的子类作为Person的子类。然后你意识到有些人可能都是......

从Person继承的Student是一个静态关系,在运行时无法更改。而学生和教师不是静态的关系......一个人既不是,也不是开始做学生,然后开始做老师,然后不再做两个,但它永远都是同一个人,该模型无法处理....

回到用户,用户与多个电子邮件帐户“关联”...如果你输入一个实例变量,你说他只是与一个电子邮件帐户“关联”,而你与你的问题域相矛盾,这就是你遇到问题的原因......

如果你说只有一个全球知名的当前用户名......同样适用。

所有情况下的问题都是你有一个问题域,而你的建模是错误的......你必须使你的程序,你的模型,行为类似于问题域....如果你不'这样做,你会遇到问题,无论你选择哪种工具来解决你的问题。

BTW:我也认为用户有一个电子邮件地址列表是错误的,但这是一个完全不同的动机。我实际上使用了

class ContactInformation
{
    User contact;
    EMailAddress email;
}

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