2017-08-15 141 views
1

我读过很多关于“public vs getter/setter”的文章,但我仍然怀疑是否有关于公共变量的任何好的部分。公有变量是不是很糟糕?

或者问题是:

如果你打算做一个新的真棒编程的语,你仍然要支持公共变量,为什么?

回答

1

公共变量本质上意味着您在对象的范围内具有全局可访问/可变的变量。这真的有用例吗?举个例子:你有一个DatabaseQueryHandler类,它有一个变量databaseAccessor。在什么情况下,你会希望此变量是:

  1. 可公开访问的(即gettable)
  2. 公开设定

选项#1我能想到的几个 - 你可能想要得到的插入操作后的最后一个插入ID,您可能想要检查生成的最后一个查询,提交或回滚事务等的任何错误,并且将这些方法写入类DatabaseAccessor而不是DatabaseQueryHandler可能更符合逻辑。

选项#2是不太理想的,特别是如果你正在做的OOP和SOLID原则遵守,特别是关于该 SP和d IP原则。在那种情况下,您想在DatabaseQueryHandler中设置变量databaseAccessor?可能只在施工中,并且在此之后从未有过。您可能还希望它在界面级别上进行类型提示,以便您可以编写界面。另外,你为什么要需要一个任意的对象能够改变数据库访问?如果Foo将变量DatabaseQueryHandler->databaseAccessor更改为NULL,然后Bar尝试呼叫DatabaseQueryHandler->databaseAccessor->beginTransaction(),会发生什么情况?

我只是在这里举一个例子,它绝不是子弹的证明。我用PHP编程(闪避烂果子),并考虑到语言的松散,非常重视OOP和SOLID。我确信围栏两边会有争论,但我会说,如果你正在考虑使用公共类变量,而不是考虑实际需要访问它,以及如何使用该变量。在大多数情况下,可以通过公共方法暴露功能,而不允许意外更改变量类型。

0

简单的回答是:是的,他们是不好的。有很多原因,如耦合和不可否认的代码。在实践中,你不应该使用它们。在OOP公共变量替代为Singleton,这被认为是一个不好的实践。检查出here

0

它与封装有很大关系。你不希望你的变量被访问。其他语言如iOS(objective-c)使用属性:

@property(nonatomic,strong)NSArray * array;

然后编译器会隐式地生成带有getter和setter的实例变量。在这种情况下,不需要使用变量(尽管其他开发人员仍然倾向于使用变量)。然后,您可以通过在.h文件中声明该属性或通过在.m文件中声明该属性来公开该属性。

1

我同意几乎一切的被其他人说,但想补充一点:

公众是不会自动不错。公众是坏的,如果你正在写一个对象类。 数据类就好了。这个班没什么问题:

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

相关问题