我想将全局变量封装在一个“数据管理器模块”中。 访问只能通过功能来避免所有丑陋 全局变量问题......因此内容完全隐藏在用户之外。 有没有现有的概念?怎么可能这样的实施 看起来像?如何将值存储在“data-manager-module”中?
答案 0 :(得分:6)
A"数据管理器模块"没有任何意义。实施一个只会扫除地毯下面一个根本糟糕的程序设计,隐藏它而不是实际清理它。全局变量的主要问题不是用户滥用,而是它们在项目中的模块之间创建紧密耦合,使其难以阅读和维护,并且还增加了错误和升级的可能性。在bug所在的模块之外。
程序中的每个数据都属于某个模块,其中一个"模块"由h文件和相应的c文件组成。称之为模块或类或ADT或任何你喜欢的。常识和OO设计都要求变量需要在它们实际所属的模块中声明,周期。
您可以通过在文件范围static
声明变量然后实现setter / getter函数来执行此操作。这是穷人的私人封装"而且不是线程安全的,但对于嵌入式系统,它在大多数情况下都能正常工作。这是声明这些变量的嵌入式行业事实上的标准。
或者更高级,您可以通过在h文件中将结构声明为不完整类型来进行真正的私有封装,并在C文件中定义它。这有时被称为" opaque type"并在对象的基础上给出真正的封装,这意味着您可以声明该类的多个实例。不透明类型也可用于实现继承(虽然以相当繁琐的方式)。
答案 1 :(得分:0)
声明并定义头文件中包含在管理器.c文件中但不包含在其.h文件中的所有变量 这样他们只能看到经理的职能。
答案 2 :(得分:0)
您可以使用getter和setter
将所有变量保存在结构体内的单个源中static struct all_globals{
long long myll;
/* ... */
} all_globals; /* Not _really_ global*/
long long getmyll(void){
return all_globals.myll;
}
long long setmyll(long long value){
return all_globals.myll = value;
}
同样,您可以使用未导出到用户API的内部头文件,然后从生成的二进制文件/库中删除符号
/* globals.c */
struct all_globals{
long long myll;
/* ... */
} all_globals; /* Not _really_ global*/
/* globals.h */
#define getmyll() all_globals.myll
#define setmyll(value) all_globals.myll = (value)
最终用户在技术上仍然可以通过足够的努力看到它,但是允许您区分全局变量并将它们保持在一起。