如何记录不同类中包含的信息?

时间:2019-07-02 15:21:04

标签: debugging logging architecture

我正在开发一个软件(使用C ++,但我认为此信息无关紧要)。该软件本质上处理8个传感器的输入,每组4个传感器。这是该软件涉及的三个类别的示意图。

class SensorManager {
    public:
        void refreshAllSensors() {
            // Launch two threads that refresh the content of each sensor
            sensorGroupA.start();
            sensorGroupB.start();
        }

    private:
        SensorGroup sensorGroupA;
        SensorGroup sensorGroupB;
}

class SensorGroup {
    public:
        void start() {
            // Iterate over all sensors in the group
            for (int i=0; i<sensors.size(); i++)
                sensors.at(i).refresh();
        }

    private:
        std::vector<Sensor> sensors;
}

class Sensor {
    public:
        void refresh() {

        } 
}

这是我面临的问题。为了调试/记录目的,记录refresh方法内部正在发生的所有信息非常重要。该信息必须标有传感器编号及其所属的传感器组。我看到三个主要选项:

  • 将组信息(从SensorManager对象传递到每个SensorGroup对象,然后传递到每个Sensor对象)和传感器编号(从SensorGroup对象传递到每个Sensor对象),然后在refresh方法中进行日志记录。但是,SensorGroupSensor将包含原则上它们不需要知道的信息(传感器组和传感器编号)。

  • 使refresh方法生成具有大量信息的数据结构,该信息将返回到SensorGroup,并从SensorGroupSensorManager。由于SensorManager包含所有信息,因此此类可以进行日志记录。这种情况下的缺点是,方法在refresh方法内完成的所有处理相关的复杂数据结构内返回了大量信息。

  • 第三种选择是编写一个Logging类,尽管来自不同类的连续调用会知道正在处理的传感器组(SensorManager调用Logging) ,正在处理的传感器(SensorGroup调用Logging)和通过刷新方法处理的信息(Sensor调用Logging)。我认为这是一种更简洁的解决方案(信息的混合仅在Logging类中存在)​​,但是在这种情况下,我对以下事实感到怀疑:两个不同的线程正在处理两个传感器组,并登录到Singleton Logging类。来自两组的信息将在Logging类中混合在一起。

您认为哪个是最佳选择?如果您认为第三个选择是最好的选择,您是否认为必须创建两个Logging对象并将其从SensorManager传递到SensorGroup,并从SensorGroup传递到{{ 1}},以避免在Logging对象中混合来自两个不同线程的信息?

0 个答案:

没有答案