在 VB.NET WinForms 应用程序中存储全局变量的最佳实践是什么。例如,当用户登录到应用程序时,您可能希望存储可以在整个应用程序中访问的 CurrentUser 对象。您可以将它作为一个对象存储在模块中,或者创建一个包含所有必需全局变量的成员的类,但您仍然需要将它的实例存储在某个地方。
该框架是否提供了一个简单的解决方案?
在 VB.NET WinForms 应用程序中存储全局变量的最佳实践是什么。例如,当用户登录到应用程序时,您可能希望存储可以在整个应用程序中访问的 CurrentUser 对象。您可以将它作为一个对象存储在模块中,或者创建一个包含所有必需全局变量的成员的类,但您仍然需要将它的实例存储在某个地方。
该框架是否提供了一个简单的解决方案?
我认为“不要”有点苛刻,这是史蒂夫·麦康奈尔(Steve McConnell)的一句话:
与纪律一起使用,全局变量在多种情况下很有用
我认为就像一个好的木匠有合适的工具来完成这项工作,并且在需要时会使用合适的工具一样,程序员也应该使用他们可以使用的所有工具。
直接来自“Tour de Force”代码完成是使用全球数据的几个原因:
麦康奈尔还说:
仅将全球数据用作最后手段。在您诉诸使用全局数据之前,请考虑一些替代方案。
以下是他列出的替代方案:
我在这里提到的东西在这本很棒的书Code Complete中得到了很好的报道
关于使用全局变量,大约有一种最佳实践。
“不。”
(如果这听起来很苛刻,请考虑像 CurrentUser 这样的东西通常属于环境已经为您维护一个唯一实例的东西,例如会话。查找 API 以获取当前会话,将您的 CurrentUser 存储在那里并从中检索它那里。不要创建自己的全局变量,这将使您的应用程序更难维护并且容易受到竞争条件的影响。)
您可以将全局可访问变量存储为适当类的公共只读静态属性,例如创建或填充它的类。
使用静态/全局变量严重损害代码的可测试性,因为测试无法确定它操作的对象不会在代码库中看似不相关的区域造成副作用。
如果您有一个需要 CurrentUser 类的实例的类,请让它在其构造函数中请求它。
有关更多信息,请参见此处:http: //misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/
我的做法是将CurrentUser、ConfigFilePath等全局变量放入program.vb (带有sub main的启动类)。这样,没有人会盲目地使用全局变量,因为它们必须通过程序命名空间来访问。
在业务逻辑中,我从不直接使用全局变量。如果任何函数需要使用全局变量,则必须将其作为函数参数发送。
没有办法避免使用全局变量。恕我直言,最好用他们的真实姓名称呼他们并小心使用它们,然后将它们隐藏在单例、会话或文件中。
单例模式比全局的花园品种更安全。