公共变量是那么糟糕吗?

时间:2017-08-15 03:58:52

标签: oop

我读过很多关于“public vs getter / setter”的文章,但我仍然想知道公共变量是否有任何好处。

或问题是:

如果你要制作一个新的精彩编程语言,你还是要支持公共变量吗?为什么?

4 个答案:

答案 0 :(得分:1)

公共变量实质上意味着您在对象范围内拥有全局可访问/可更改变量。这真的是一个用例吗?

举个例子:你有一个类DatabaseQueryHandler,它有一个变量databaseAccessor。在什么情况下你希望这个变量是:

  1. 可公开访问(即可获取)
  2. 公开可设定
  3. 选项#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)

简单的答案是:是的,他们糟糕。像耦合和无法编写的代码有很多原因。在实践中,你不应该使用它们。在OOP中,公共变量替代是Singleton,这被认为是不好的做法。查看here

答案 3 :(得分:0)

它与封装有很大关系。您不希望无论如何都要访问您的变量。 iOS(objective-c)等其他语言使用属性:

@property(非原子,强)NSArray *数组;

然后编译器将隐式生成带有getter和setter的实例变量。在这种情况下,不需要使用变量(尽管其他开发人员仍然喜欢使用变量)。然后,您可以通过在.h文件中将其声明为public,或者通过在.m文件中声明它来将其公开。