我正在开发一个软件(使用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方法中进行日志记录。但是,SensorGroup
和Sensor
将包含原则上它们不需要知道的信息(传感器组和传感器编号)。
使refresh方法生成具有大量信息的数据结构,该信息将返回到SensorGroup
,并从SensorGroup
到SensorManager
。由于SensorManager
包含所有信息,因此此类可以进行日志记录。这种情况下的缺点是,方法在refresh
方法内完成的所有处理相关的复杂数据结构内返回了大量信息。
第三种选择是编写一个Logging
类,尽管来自不同类的连续调用会知道正在处理的传感器组(SensorManager
调用Logging
) ,正在处理的传感器(SensorGroup
调用Logging
)和通过刷新方法处理的信息(Sensor
调用Logging
)。我认为这是一种更简洁的解决方案(信息的混合仅在Logging类中存在),但是在这种情况下,我对以下事实感到怀疑:两个不同的线程正在处理两个传感器组,并登录到Singleton Logging
类。来自两组的信息将在Logging
类中混合在一起。
您认为哪个是最佳选择?如果您认为第三个选择是最好的选择,您是否认为必须创建两个Logging
对象并将其从SensorManager
传递到SensorGroup
,并从SensorGroup
传递到{{ 1}},以避免在Logging对象中混合来自两个不同线程的信息?