2009-10-29 116 views
6

我已经在各种地方读过全局变量的变量,即带有静态成员的公共静态类,被认为违背了面向对象的哲学,并且不是很好的设计。 (例如,我已经看到如下评论:“如果你使用的是全球性的,那么你的做法是不正确的。”或者这样的话)全局变量v C#中的设置

但是,如果你使用Settings机制Visual Studio,例如“Settings.Default.MySetting”等等,这在整个应用程序中是全局可用的,所以这与使用公共静态类有什么不同?

此外,使用单例对象也可以获得相同的结果,但这至少可以引发各种意见。 (VB模块,任何人?),但我想教自己如何正确地做这个OO malarky,所以,如果全局变量从面向对象的角度来看味道不好,什么是什么?是另一种选择?

我对使用'设置'功能的人的意见特别感兴趣。这被认为是很好的面向对象设计?

谢谢你的任何意见。

回答

14

静态方法和其他成员本身并不错。只是那些对OO概念不太熟悉的人往往会将静态方法,属性和字段放到代码中,而不会意识到后果。

一般来说,对于像配置设置,帮助程序和实用程序类,抽象工厂,单身人士等具有静态成员的东西是完全可以接受的。

1

公共静态类或成员并不总是一个坏主意(即使它不是完美的OO)。许多优秀的面向对象设计使用公共静态成员来完成Loggers或Settings等任务(正如您所指出的那样)。一个很好的例子是如何以OO的方式做到这一点是Static Gateway

1

像gotos这样的全局变量是所有初学者都应该避免的,但对于高级程序员来说是非常有用的。

我会说,如果你不觉得自信,并且你没有一个明确的,合理的理由,为什么它是一个很好的应用,不要使用它们。在恢复全局变量之前掌握OO。

0

设置机制...嗯...

我看那些主要作为环境的一部分。像操作系统或时间,但对于应用程序。它们并不像你在INIT期间声明的那样是“变量”。

但是,您可以在它们周围包装一个对象,并且只能通过该对象访问它们,而不是在运行时需要它们时读取它们。我没有对它进行测试,但它可能是一种性能上的洗牌(或者如果你没有做好内存管理,那么对它们进行原始测试就是消极的)。

最终,随着应用程序的成熟,像这样的事情最终会让对象缠绕在它们周围。我的规则是,每当我开始思考时,“不,这太简单了,太原子了,不需要一个对象......”这是我把它作为一个对象的线索。

2

在C#中,您将很难与优秀的OO设计相媲美,因为您无法摆脱OO。它不像C++那样可以混合和匹配结构化的OO编程 - 这种类型的争论经常发生的领域。 类中的静态成员是OO。微软的生成设置也是如此,因为代码生成会为它们创建OO封装,或者至少为它们周围的“对象容器”创建OO封装。所以他们从来都不是全局变量,因为它在C#中不存在 - 它们只是类中的静态成员 - 没有那些非OO。

如果参数是关于单身对静态成员,那么它将一个OO参数与另一个OO参数对齐。

然后总是有哲学观点和实践观点。在大多数国家,理想哲学观点的实施并不是真正值得的,除了学术研究之外。现实世界需要真正的解决方案和混合解

+2

很难过?是。难以停止一个坚定的,无能的开发者吗?决不。我已经失去了我看到某种方式实施的次数,这种方式比设计的方式更加困难和不那么正确。 (如果我说我从来没有犯过这样的事情,我会撒谎的。) – 2009-10-29 19:20:56

+0

好点的格雷格D.你应该看到我过去的代码snafus! – 2009-10-29 19:23:41