为所有类提供运行时参数的规范方法——global



解决这类问题的规范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?
    }
}

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

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

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

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

对不起,但我没有看到"一刀切"的方法。选择一个,然后跟着它走。如果你不能决定,就掷骰子或抛硬币。

相关内容

最新更新