Как регистрировать информацию, содержащуюся в разных классах? - PullRequest
0 голосов
/ 02 июля 2019

Я занимаюсь разработкой программного обеспечения (на 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, чтобы избежать смешивания информации в журнале объект из двух разных потоков?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...