D:全局变量不好吗?
D: are global variables bad?
有时我需要获取可以从任何代码位置访问的变量变量。但是我经常听说全局变量不好。对于这种情况,D 中的最佳做法是什么?
现在我的代码如下所示:
string roothtml;
static this()
{
roothtml = buildPath(getcwd, "html");
}
void main()
{
//
}
这是好事还是坏事?
这取决于您 'global' 的真正意思。在上面的例子中,我会说它很好。
您似乎在展示一个 main
模块,它可能不应该被导入
任何事情。换句话说,它并不是真正的 global,它是本地的
模块。真的和
没什么区别
class Main {
private string _roothtml;
static this() { _roothtml = buildPath(getcwd, "html"); }
void run() { }
}
即使它不是你的 main
,D 的
module
系统为其提供保护
自己的。只需在 roothtml
上粘贴一个 private
以将其封装在模块中
(无论如何,在你的主模块中这样做并没有什么坏处,只是为了清楚)。
git 的源代码中广泛使用了这样的模式。而不是
有一个为给定命令调用函数的主模块,你
有许多 main
功能 -- 每个顶级命令一个。
例如,看看
upload-pack.c
.
看到那些在源文件顶部声明的变量了吗?
如果将代码包裹在 class 中,代码会不会更清晰或更安全?
典型的 OOP 风格或以更纯粹的方式显式传递给每个函数
功能风格?
每个源文件作为给定命令的封装单元。这种风格并不总是合适的,但是对于可以被认为是一组不同命令的程序,它可以比其他选择更简洁。
最终,答案将特定于上下文、您给定的项目和
你的个人风格。一般来说,跨模块全局变量是
被怀疑地看待,但模块级变量有时可以更干净
比其他选择。
全局变量存在问题有几个原因。
- 阅读时更难追踪变量的来源。这使得使用全局变量更难理解函数。
- 很难跟踪变量的使用位置。这使得修改全局变量的使用方式变得更加困难。
- 注入测试数据和测试存根比较尴尬
- 测试状态将溢出到其他测试。
__gshared
全局变量需要锁定或不变性。
- 线程局部全局变量是线程局部的,因此您不能将写入传播到所有线程。
- 任何全局变量都需要您考虑是希望它是线程本地的还是
__gshared
。
- 如果您需要将单租户应用程序转换为多租户应用程序,如果您使用的是全局变量,那将会很痛苦。而且它比您可能怀疑的更常见。
- 当 运行 你的应用程序时,你必须小心不要使用
-unittest
构建,这样你就不会破坏在静态构造函数中初始化的全局状态。
从好的方面来说,您不必在任何地方都传递全局状态,这很方便。您不必经常使用方法对方法对象进行重构。您不必引入依赖注入系统。不咬人的时候很方便
有时我需要获取可以从任何代码位置访问的变量变量。但是我经常听说全局变量不好。对于这种情况,D 中的最佳做法是什么?
现在我的代码如下所示:
string roothtml;
static this()
{
roothtml = buildPath(getcwd, "html");
}
void main()
{
//
}
这是好事还是坏事?
这取决于您 'global' 的真正意思。在上面的例子中,我会说它很好。
您似乎在展示一个 main
模块,它可能不应该被导入
任何事情。换句话说,它并不是真正的 global,它是本地的
模块。真的和
class Main {
private string _roothtml;
static this() { _roothtml = buildPath(getcwd, "html"); }
void run() { }
}
即使它不是你的 main
,D 的
module
系统为其提供保护
自己的。只需在 roothtml
上粘贴一个 private
以将其封装在模块中
(无论如何,在你的主模块中这样做并没有什么坏处,只是为了清楚)。
git 的源代码中广泛使用了这样的模式。而不是
有一个为给定命令调用函数的主模块,你
有许多 main
功能 -- 每个顶级命令一个。
例如,看看
upload-pack.c
.
看到那些在源文件顶部声明的变量了吗? 如果将代码包裹在 class 中,代码会不会更清晰或更安全? 典型的 OOP 风格或以更纯粹的方式显式传递给每个函数 功能风格?
每个源文件作为给定命令的封装单元。这种风格并不总是合适的,但是对于可以被认为是一组不同命令的程序,它可以比其他选择更简洁。
最终,答案将特定于上下文、您给定的项目和 你的个人风格。一般来说,跨模块全局变量是 被怀疑地看待,但模块级变量有时可以更干净 比其他选择。
全局变量存在问题有几个原因。
- 阅读时更难追踪变量的来源。这使得使用全局变量更难理解函数。
- 很难跟踪变量的使用位置。这使得修改全局变量的使用方式变得更加困难。
- 注入测试数据和测试存根比较尴尬
- 测试状态将溢出到其他测试。
__gshared
全局变量需要锁定或不变性。- 线程局部全局变量是线程局部的,因此您不能将写入传播到所有线程。
- 任何全局变量都需要您考虑是希望它是线程本地的还是
__gshared
。 - 如果您需要将单租户应用程序转换为多租户应用程序,如果您使用的是全局变量,那将会很痛苦。而且它比您可能怀疑的更常见。
- 当 运行 你的应用程序时,你必须小心不要使用
-unittest
构建,这样你就不会破坏在静态构造函数中初始化的全局状态。
从好的方面来说,您不必在任何地方都传递全局状态,这很方便。您不必经常使用方法对方法对象进行重构。您不必引入依赖注入系统。不咬人的时候很方便