Я занимаюсь разработкой программного обеспечения (на 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
objec до каждого объекта Sensor
) и затем выполните регистрацию внутри метода обновления. Однако SensorGroup
и Sensor
будут содержать информацию, которую в принципе им не нужно знать (группа датчиков и номер датчика).
Сделайте так, чтобы метод refresh генерировал структуру данных с большим количеством информации, которая возвращается к SensorGroup
и от SensorGroup
до SensorManager
. Поскольку SensorManager
содержит всю информацию, этот класс может вести запись в журнал. Недостатком в этом случае является то, что методы возвращают много информации внутри сложных структур данных, связанных со всей обработкой, выполняемой в методе refresh
.
Третий вариант - написать класс Logging
, который, хотя бы при последовательных вызовах из разных классов, знает, какая группа датчиков обрабатывается (SensorManager
вызывает Logging
), а датчик обрабатывается ( SensorGroup
вызывает Logging
) и информацию, обработанную методом обновления (Sensor
вызывает Logging
). Я думаю, что это гораздо более чистое решение (смесь информации присутствует только в классе Logging), но в этом случае я сомневаюсь в том, что два разных потока обрабатывают две группы датчиков и регистрируются в классе Singleton Logging
. Информация из обеих групп будет смешана в классе Logging
.
Какой, по вашему мнению, лучший вариант? Если вы считаете, что третий вариант является лучшим, считаете ли вы, что два Logging
объекта должны быть созданы и переданы от SensorManager
до SensorGroup
и от SensorGroup
до Sensor
, чтобы избежать смешивания информации в журнале объект из двух разных потоков?