【发布时间】:2021-11-12 03:10:48
【问题描述】:
假设我有一个使用 n 个大模块的程序:
A) 网络/通讯
B) I/O 文件
C) I/O 数据库
D) 图形用户界面
E) ...
当然,模块列表可以更大。
假设我想要一些全局变量,但范围仅限于单个模块。
例如,假设 I/O 数据库模块将包含 10 个类,每个类代表数据库中的每个表,但它需要一些 global const 状态,例如 Name of table A、Columns of table A 等(因为它是关系型数据库,在表DI中可能需要用到表A)。
也很明显,我不需要通过网络/通信模块访问这些表名。有没有办法让变量“全局”地只对类的某些部分可访问?
只是为了澄清-我知道“对某些部分来说是全局的”是一个矛盾,但我的想法是我想保持可访问性(不需要将指针传递给每个对象),同时限制它可以的位置被调用(例如,从全局范围限制到模块范围)
【问题讨论】:
-
命名空间不够吗?除非你有一个硬限制,比如“A 不能访问 B,但 C 可以访问 B”。
-
这不是
static关键字的用途吗? -
你不需要全局变量,我强烈建议你学习依赖注入。基本上你有一个“工厂”模块。每个模块都有一个接口,您可以注入一个具有 getter 的接口来访问集中数据。 (例如,类的 n 个实例的成员)。这也允许您使用模拟和存根测试独立模块(例如,返回其他值的测试类)。
-
依赖注入应该比命名空间更好。您可以控制每个模块的范围,但是如果您已经有一个庞大的项目并且主要使用全局单例..那将是非常痛苦的。
-
C++20 模块可能会有所帮助。