我读过很多关于“public vs getter / setter”的文章,但我仍然想知道公共变量是否有任何好处。
或问题是:
如果你要制作一个新的精彩编程语言,你还是要支持公共变量吗?为什么?
答案 0 :(得分:1)
公共变量实质上意味着您在对象范围内拥有全局可访问/可更改变量。这真的是一个用例吗?
举个例子:你有一个类DatabaseQueryHandler
,它有一个变量databaseAccessor
。在什么情况下你希望这个变量是:
选项#1我可以想到一些 - 您可能想要在插入操作后获取最后一个插入ID,您可能想要检查上一个查询生成,提交或回滚事务等的任何错误,它可能在DatabaseAccessor
课程中编写这些方法比DatabaseQueryHandler
更具逻辑意义。
选项#2不太理想,特别是如果您正在进行OOP并遵守SOLID原则,特别是关于 I SP和 D IP原则。在这种情况下,您希望何时在databaseAccessor
中设置变量DatabaseQueryHandler
?可能只在建筑上,而在此之后的任何时间都没有。您可能还希望它在接口级别提示类型,以便您可以编写接口代码。另外,为什么你需要一个任意对象才能改变数据库访问器?如果Foo
将变量DatabaseQueryHandler->databaseAccessor
更改为NULL
,然后Bar
尝试调用DatabaseQueryHandler->databaseAccessor->beginTransaction()
会怎样?
我在这里举一个例子,这绝不是防弹。我使用PHP进行编程(躲避烂烂的水果)并且考虑到语言的松散性,非常认真地对待OOP和SOLID。我确信围栏的两边都会有争论,但我会说,如果你正在考虑使用公共类变量,而是考虑实际需要访问它的内容,以及如何使用该变量。在大多数情况下,可以通过公共方法公开功能,而不允许对变量类型进行意外更改。
答案 1 :(得分:1)
我几乎同意其他所有人都说过的话,但是想补充一点:
公众自动不好。如果你正在写一个 Object 类,那么公众就不好了。 数据类很好。这堂课没有错:
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()方法。&# 34;更糟糕的是,如果他们搞砸了,他们就会以一种不是预期的方式使用这个课程,并且会以一种不可预见的后果发挥作用!
如果您想了解更多信息,请查看Robert Martin的第6章“清洁代码”,第34页“数据/对象反对称性”#34;
答案 2 :(得分:0)
答案 3 :(得分:0)
它与封装有很大关系。您不希望无论如何都要访问您的变量。 iOS(objective-c)等其他语言使用属性:
@property(非原子,强)NSArray *数组;
然后编译器将隐式生成带有getter和setter的实例变量。在这种情况下,不需要使用变量(尽管其他开发人员仍然喜欢使用变量)。然后,您可以通过在.h文件中将其声明为public,或者通过在.m文件中声明它来将其公开。