我读过很多关于“public vs getter/setter”的文章,但我仍然怀疑是否有关于公共变量的任何好的部分。公有变量是不是很糟糕?
或者问题是:
如果你打算做一个新的真棒编程的语,你仍然要支持公共变量,为什么?
我读过很多关于“public vs getter/setter”的文章,但我仍然怀疑是否有关于公共变量的任何好的部分。公有变量是不是很糟糕?
或者问题是:
如果你打算做一个新的真棒编程的语,你仍然要支持公共变量,为什么?
公共变量本质上意味着您在对象的范围内具有全局可访问/可变的变量。这真的有用例吗?举个例子:你有一个DatabaseQueryHandler
类,它有一个变量databaseAccessor
。在什么情况下,你会希望此变量是:
选项#1我能想到的几个 - 你可能想要得到的插入操作后的最后一个插入ID,您可能想要检查生成的最后一个查询,提交或回滚事务等的任何错误,并且将这些方法写入类DatabaseAccessor
而不是DatabaseQueryHandler
可能更符合逻辑。
选项#2是不太理想的,特别是如果你正在做的OOP和SOLID原则遵守,特别是关于该我 SP和d IP原则。在那种情况下,您想在DatabaseQueryHandler
中设置变量databaseAccessor
?可能只在施工中,并且在此之后从未有过。您可能还希望它在界面级别上进行类型提示,以便您可以编写界面。另外,你为什么要需要一个任意的对象能够改变数据库访问?如果Foo
将变量DatabaseQueryHandler->databaseAccessor
更改为NULL
,然后Bar
尝试呼叫DatabaseQueryHandler->databaseAccessor->beginTransaction()
,会发生什么情况?
我只是在这里举一个例子,它绝不是子弹的证明。我用PHP编程(闪避烂果子),并考虑到语言的松散,非常重视OOP和SOLID。我确信围栏两边会有争论,但我会说,如果你正在考虑使用公共类变量,而不是考虑实际需要访问它,以及如何使用该变量。在大多数情况下,可以通过公共方法暴露功能,而不允许意外更改变量类型。
它与封装有很大关系。你不希望你的变量被访问。其他语言如iOS(objective-c)使用属性:
@property(nonatomic,strong)NSArray * array;
然后编译器会隐式地生成带有getter和setter的实例变量。在这种情况下,不需要使用变量(尽管其他开发人员仍然倾向于使用变量)。然后,您可以通过在.h文件中声明该属性或通过在.m文件中声明该属性来公开该属性。
我同意几乎一切的被其他人说,但想补充一点:
公众是不会自动不错。公众是坏的,如果你正在写一个对象类。 数据类就好了。这个班没什么问题:
public class CommentRecord
{
public int id;
public string comment;
}
...为什么?因为该类不是使用任何东西的变量。这只是一个数据对象 - 这是意味着是只是一个简单的数据存储库。
但有绝对有毛病这个类:
public class CommentRecord
{
public int id;
public string comment;
public void UpdateInSQL()
{
// code to update the SQL table for the row with commentID = this.id
// and set its UserComment column to this.comment
}
}
...这是为什么不好?因为它不是数据类。这是一个类,实际上它的变量做的东西 - 因为这一点,使他们的公共部队使用类知道类的内部人。在使用的人需要知道:“如果我想更新自己的评论,我必须要改变公共变量,但不更改ID,然后调用UpdateInSQL()方法。”更糟糕的是,如果他们搞砸了,他们会以一种无意的方式来使用这门课程,并且这种方式会导致未预料到的后果!
如果您想了解更多关于此的信息,请参阅Robert Martin,第6章关于“Data/Object Anti-Symmetry”的Clean Code