精英盒子
->
零毫秒
->
关于配置文件机制的实现的讨论
[打印本页]
jybox
2011-12-05 20:45
关于配置文件机制的实现的讨论
暂时只讨论服务器工程
原来的架构:
../public/const.h(全局公共定义)
const.h(服务器工程专有的定义)
现将其中的大部分选项移出到配置文件,剩下没有修改必要的选项留在const.h
但有个问题,有些选项(例如端口号),服务器和客户端是相同的,但这部分很难重用(因为客户端和服务器是两个不同的配置文件,需要在两个文件中都写一份)
默认配置文件在./config.ini,ini格式,其中有注释来指导用户修改(用#号注释,不用分号,虽然分号也可以注释ini,但是#号好看点)
同时将这个默认配置文件加入资源文件
运行时:
判断是否有配置文件
如没有,输出资源文件中的默认配置文件
读取入内存
在ini文件的读取上,可以用QSettings
采用启动时一次性读入内存,之后一律从内存读取选项(或者可以增加"重新读取"的按钮)
在const.h中新增:
复制代码
QSettings *config;//全局对象,用来访问配置
void loadConfig();//重新读取配置的函数的声明,也就是加载config
新增settings.cpp,实现loadConfig()函数
------------------------------------------------------------------
关于如何读取配置文件值
有两种方案,各有利弊
1.直接用QSettings读取
复制代码
//setting.cpp
config=new QSettings("./config.ini");
//读取时
int port=config->value("SERVER_PORT").toInt();
缺点:
(1)需要函数调用有性能损耗.(2)代码太长了
2.预先读取到变量中
复制代码
//const.h
int SERVER_PORT;
//等等.....
//setting.cpp
SERVER_PORT=config->value("SERVER_PORT").toInt();
//等等......
//读取时
int port=SERVER_PORT;
缺点:维护成本太高了(同一个常量名要出现在三个地方)
-----------------------------------------------------------------------------------------
默认值问题
现在只能做到当没有配置文件时,自动输出默认配置文件
但当需要一个选项值,而配置文件中没有的时候,就会出错
而apache.ini\php.ini在这种情况下都会自动使用默认值
其实这个问题也好解决,只要再同时打开一个默认配置文件就行了
复制代码
//const.h
QSettings *config;
QSettings *defaultConfig;
//settings.cpp
config=new QSettings("./config.ini");
defaultConfig=new QSettings(":/config.ini");
//读取时
int port=config->value("SERVER_PORT",defaultConfig->value("SERVER_PORT"));
//请参见Qt文档中有关QSettings::value()的内容
但是.....貌似代码变得更长了....而且常量名出现了两次
那么,封装成一个函数呢?
复制代码
//const.h
QVariant configValue(QString key);//函数实现略
//读取时
int port=configValue("SERVER_PORT").toInt();
看起来好点了,不过还是需要一个类型转换....不完美
而且调用函数的成本又增大了
求对比上面各种实现方法的利弊
mason
2011-12-06 18:28
我觉得配置文件的格式应该用xml比较好,毕竟可读性很强,而且Qt也支持xml,工程量会减少很多。
mason
2011-12-06 18:29
whtsky
2011-12-06 18:58
调用函数成本不用担心,这种效率问题根本不叫问题。
直接qsettings.
jybox
2011-12-06 19:31
mason
:
我觉得配置文件的格式应该用xml比较好,毕竟可读性很强,而且Qt也支持xml,工程量会减少很多。
(2011-12-06 18:28)
我是这样想的...有层次关系的用xml,无层次关系的用ini
Powered by
phpwind
v8.7
Code ©2003-2011
phpwind
Time 0.042768 second(s),query:5 Gzip enabled