设置模块

打印 上一主题 下一主题

主题 916|帖子 916|积分 2748

概述

什么是设置?chatGPT是这么回答的:
设置项(Configuration Item)是一个广泛使用的术语,尤其在软件开发、体系管理和IT服务管理中。它通常指的是体系或应用步伐中的一个可设置的元素,可以用来调解体系或应用的行为、性能或其他特性。设置项可以是软件、硬件、文档、数据库、参数设置等。
设置项的用途

  • 定制化:通过调解设置项,可以让同一软件或体系在不同环境中运行时体现出不同的行为和特性。
  • 优化性能:通过修改设置参数,可以优化体系或应用步伐的性能。
  • 提高安全性:设置安全参数和策略,增强体系或应用步伐的安全性。
  • 简化管理:通过会合管理和控制设置项,可以简化体系或应用步伐的管理和维护。
Sylar使用YAML作为设置文件。最简单的设置文件方式还是 .ini 那种,选择YAML是因为易读易写,同时能支持复杂的数据结构。这里支持 STL 容器(vector, list, set, map 等等),支持自定义范例(但需要实现序列化和反序列化方法,也就是两个仿函数)。YAML 语法快速简单入门:https://www.runoob.com/w3cnote/yaml-intro.html
在设置模块中主要有以下几个类:

  • class ConfigVarBase:设置变量的基类
  • class ConfigVar:设置参数模板子类,生存对应范例的参数值,通过仿函数实现string和T范例之间的相互转化
  • class Config:ConfigVar的管理类
最后将日志模块与设置模块整合起来,当设置文件相应参数做出改变时,可以或许通过回调函数改变相应的参数。
设置模块实现了以下功能:

  • 支持yaml格式的设置文件解析
  • 使用模板完成基础范例,复杂范例(vector、map、set等),自定义范例的序列化与反序列化
  • 利用回调机制,在加载设置时,完成设置的更新
  • 使用yaml-cpp库,实现设置文件读取
  • 约定大于设置
详解

设置变量的基类 class ConfigVarBase

虚基类。包罗设置名称和设置形貌两个属性。提供 toString() 和 fromString() 两个纯虚函数将参数值转换成 YAML String 和从 YAML String 转成参数的值。
  1. // 名字
  2. std::string m_name;
  3. // 描述
  4. std::string m_description;
  5. virtual std::string toString() = 0; //转化为string
  6. virtual bool fromString(const std::string& val) = 0;    //从string转化为相应类型
  7. virtual std::string getTypeName() const = 0;    //获得该类型的名称
复制代码
ConfigVarBase(构造函数 )

std::transform被用于将字符串m_name中的字母字符转换为小写形式并覆盖原来的字符串。所以不区分大小写
  1. ConfigVarBase(const std::string& name, const std::string &description = "")
  2.        : m_name(name)
  3.        , m_description(description)  {
  4.        std::transform(m_name.begin(), m_name.end(), m_name.begin(), ::tolower);
  5.    }
复制代码
设置参数 class ConfigVar
  1. /*
  2. *  T 参数的具体类型
  3. *  FromStr 从std::string转换成T类型的仿函数
  4. *  ToStr 从T转换成std::string的仿函数
  5. *  std::string 为YAML格式的字符串
  6. */
  7. template <class T, class FromStr = LexicalCast<std::string, T>
  8.                , class ToStr = LexicalCast<T, std::string> >
  9. class ConfigVar : public ConfigVarBase {};
复制代码

  • 对于每种范例的设置,在对应的 ConfigVar 模板类实例化时都要提供其 FromStr 和 ToStr 两个仿函数,用于实现该范例和 YAML 字符串的相互转换。
  • 设置参数模板子类。继承自 ConfigVarBase。
  • 生存对应范例 T 的参数值。
  • 根据不同的非内置基本范例 T,FromStr 和 ToStr 具有不同的模板偏特化实现。
  • 内含一个 std::map,存放设置变更的回调函数。
    提供 setValue() 和 getValue() 函数,其中在 setValue() 函数中,会调用 std::map 中存放的所有回调函数进行通知设置变更。
  • 关于回调函数,提供 addListener()、delListener()、getListener()、clearListener() 四个函数给外界使用。
    其中,FromStr和ToStr使用仿函数片特化的方式,实现不同范例T与string之间的相互转化,例如vector与string之间的转化,在转化的过程中,字符串格式都是以YAML为标准。
[code]//F from_type, T to_typetemplateclass LexicalCast {public:    T operator() (const F &v) {        return boost::lexical_cast(v);    }};​// string To vector// "[1, 2, 3]" ——> [1, 2, 3]templateclass LexicalCast {public:    std::vector operator() (const std::string& v) {        YAML::Node node = YAML:oad(v);        typename std::vector vec;        std::stringstream ss;        for (size_t i = 0; i < node.size(); ++i) {            ss.str("");            ss  - 1//               - 2//               - 3             templateclass LexicalCast {public:    std::string operator() (const std::vector& v) {        YAML::Node node;        for (auto& i : v) {            node.push_back(YAML:oad(LexicalCast()(i)));        }        std::stringstream ss;        ss
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表