为所有类提供运行时参数的规范方法 - 全局?

时间:2014-05-21 18:49:54

标签: c++ design-patterns singleton

用于解决此类问题的规范C ++设计模式是什么?

我有一些共享多个类的多线程服务器。我需要为大多数类提供各种运行时参数(例如服务器名称,日志记录级别)。

在下面的伪C ++代码中,我使用日志记录类的参数作为一个这样的示例,但可能还有其他值需要在各种对象中访问。

特别是,Thread对象需要拥有自己的日志类实例以避免损坏。

我可以将运行时参数设置为全局或静态,但这些参数似乎都有代码味道。同样,单个或将值传递给许多构造函数或初始化器似乎不是最优的或违反了得墨忒耳定律。

Server类(下面)中的Thread类不是我现在可以改变的东西,尽管它可能会妨碍更优雅的方式。 : - /

请原谅以下快速而肮脏的C ++代码;希望它充分说明了这个问题。

// p1.cpp
int main(int argc, char** argv) {
    Log log(level, "p1");
    Driver driver;
    driver.exec(new p1Factory());
}
// p2.cpp
int main(int argc, char** argv) {
    Log log(level, "p2");
    Driver driver;
    driver.exec(new p2Factory());
}
// p3 ... p7.cpp same as above

class Driver {
public:
    Driver() {}
    void exec(GenericFactory * f) { factory = f; server.createThreads(); }
protected:
    GenericFactory * factory;
    Server server(GenericFactory * f);
};

class Server : public GenericServer {
protected:
    class Thread : public IPCThread
    {
        friend class Server;
    private:
        Channel * channel;
        Log threadLog;
    public:
        Thread(Channel * c);
    };

    GenericFactory * factory;

public:
    Server(GenericFactory * f);
    void createThreads();
};

Server::createThreads() {
    for (int i = 0; i < threads; ++i) {
        thread[i] = new Server::Thread(factory->getChannel());
        // I need to set the threadLog's level and ident string to the
        // same values they had in the top-level global log.  How?
    }
}

1 个答案:

答案 0 :(得分:1)

我不知道规范方法,但这里有一些技巧。

存储为全局变量
将值复制到全局变量中。将头文件中的变量名称提供为extern

将参数传递给需要变量的每个函数
一些反对Singletons的人说要将变量传递给需要它们的所有函数。

存储在配置函数/类中
您可以创建一个Configuration单例,用于读取和解析命令行。该实体将具有读取参数但不写入参数的方法。

抱歉,我没有看到“一刀切”的方法。选择一个并继续使用它。如果你不能决定,掷骰子或翻硬币。