精英盒子 -> 零毫秒 -> 关于配置文件机制的实现的讨论 [打印本页]

jybox 2011-12-05 20:45

关于配置文件机制的实现的讨论

暂时只讨论服务器工程

原来的架构:
../public/const.h(全局公共定义)
const.h(服务器工程专有的定义)

现将其中的大部分选项移出到配置文件,剩下没有修改必要的选项留在const.h
但有个问题,有些选项(例如端口号),服务器和客户端是相同的,但这部分很难重用(因为客户端和服务器是两个不同的配置文件,需要在两个文件中都写一份)

默认配置文件在./config.ini,ini格式,其中有注释来指导用户修改(用#号注释,不用分号,虽然分号也可以注释ini,但是#号好看点)
同时将这个默认配置文件加入资源文件

运行时:
判断是否有配置文件
如没有,输出资源文件中的默认配置文件
读取入内存

在ini文件的读取上,可以用QSettings
采用启动时一次性读入内存,之后一律从内存读取选项(或者可以增加"重新读取"的按钮)
在const.h中新增:
  1. QSettings *config;//全局对象,用来访问配置
    void loadConfig();//重新读取配置的函数的声明,也就是加载config
新增settings.cpp,实现loadConfig()函数
------------------------------------------------------------------
关于如何读取配置文件值
有两种方案,各有利弊
1.直接用QSettings读取
  1. //setting.cpp
    config=new QSettings("./config.ini");
    //读取时
    int port=config->value("SERVER_PORT").toInt();
缺点:
(1)需要函数调用有性能损耗.(2)代码太长了
2.预先读取到变量中
  1. //const.h
    int SERVER_PORT;
    //等等.....
    //setting.cpp
    SERVER_PORT=config->value("SERVER_PORT").toInt();
    //等等......
    //读取时
    int port=SERVER_PORT;
缺点:维护成本太高了(同一个常量名要出现在三个地方)
-----------------------------------------------------------------------------------------
默认值问题
现在只能做到当没有配置文件时,自动输出默认配置文件
但当需要一个选项值,而配置文件中没有的时候,就会出错
而apache.ini\php.ini在这种情况下都会自动使用默认值

其实这个问题也好解决,只要再同时打开一个默认配置文件就行了
  1. //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()的内容

但是.....貌似代码变得更长了....而且常量名出现了两次

那么,封装成一个函数呢?
  1. //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