我最近加入了一个项目(初级),那里有一个外部配置样式服务-基本上是一个用jsonrpc调用的KV商店。
不要问它为什么在那里。
我需要查询此配置服务以获得代码库内部使用的白名单。
但是,如果不使用全局变量,就无法找到解决方案。例如,我调用一个函数从软件包num.reframe()
获取配置,但必须导出var以便在其他软件包中使用。我最初的解决方案是使用A
设置程序包中的缓存,并导出缓存访问器以进行某种类型限制。但是,这增加了复杂性,而且似乎不仅仅是将val存储在导出的var中。
我已经看到标准库中使用了全局变量,但是感到困惑,因为这将违反封装法则?
将感谢您提供任何有关解决此类问题的建议。
答案 0 :(得分:2)
如果您的项目规模较小或预计不会有太大变化,那么全球 配置可能还可以。不过,我会将config变量放在自己的程序包中。另一方面,如果预期该项目会结束 时间,将事物封装起来很有意义。
您能否将配置作为参数从软件包get_terms('my_taxonomy')
传递到任何其他软件包
需要方法或构造函数args的形式吗?我认为传递事物
周围使对配置的依赖性显而易见,也使操作更容易
在测试中模拟。
我个人会这样构造项目(如果我是从头开始的, 可能不是您所拥有的奢侈品):
A
所有配置资料都在project root
|
|- config/
| |- Config (interface) -> knows how to fetch config form JSON-RPC and caches it if necessary
| | |- GetSomething1()
| | |- GetSomething2()
| | |- Get(key string) -> If you have arbitrary keys
| |
| |- NewJsonRpcConfig(settings) -> returns something that implements the Config interface
|
|- main.go -> calls config.NewConfig()
|
|- Passes the resulting Config interface as a parameter to anything that needs it.
Packages don't directly interact with a global variable.
包中。它可以与JSON-RPC对话
服务器,也许缓存结果并返回配置。 config
包
创建配置提取程序的实例,并将其传递给所有
需要使用配置。