Передача лога о выполняемых действиях из подчиненного уровня
От: es3000  
Дата: 22.05.19 10:24
Оценка:
Здравствуйте!

Подскажите, пожалуйста:
как правильно делается передача лога (протокола, журнала) о выполняемых действиях в подчиненных модулях на вышестоящий (вызывающий) уровень?

Есть программа обмена с кассами.
Главная форма отображает:
— таблицу касс с тремя колонками: флажок выбора кассы для выполнения операции, название кассы, результат последнего обмена;
— две кнопки: "Выгрузить" и "Загрузить".
После нажатия на кнопку и выполнения обмена (загрузки или выгрузки) в колонке "Результат" для соответствующей кассы должно быть написано типа "Успех" или "Ошибка".
Чтобы узнать подробнее, что происходило при обмене, можно щелкнуть на поле "Результат" и открывается дополнительная форма, в которой отображается более подробная информация обо всех действиях с кассой в виде списка текстовых строк типа журнала (или лога).
Пока для простоты журнал представляет собой просто массив строк.
Например:
— "В настройках кассы не указан каталог обмена"
— "Отсутствует каталог обмена"
— "Ошибка записи данных в файл obmen.txt"
— "Не выполнен обмен с кассой Касса5"

Проблема в том, что обработка обмена реализована несколькими классами, которые вызывают друг друга.
Я разбил все классы на уровни, основные уровни: UI, Бизнес-логика, Обмен с кассой в конкретном формате.
И получилась большая "глубина" вызовов.
Например:
класс "Главная форма" -> презентер -> контроллер "Обработка списка касс" — > класс бизнес-логики "Операция с кассой" -> класс "Обмен в формате ХХХ" -> Работа с файловой системой и т. д.
То есть самый "глубокий" класс ничего не знает о самом верхнем классе (о Главной форме), в который надо передать лог-журнал.

Кроме того, при работе "внутренних" классов и модулей могут возникать исключения.
Эти исключения должны перехватываться, и также записываться в этот "вышестоящий" журнал.
А также, чисто теоретически, все это может выполняться в многопоточном режиме и причем с разных рабочих мест.

Как это делается?

Самое простое — это передавать объект ResultArray в качестве параметра во все вызываемые методы.
Но это очень не удобно.
Так как например модуль "Обмена в формате ХХХ" уже написан, менять все методы неохота.
А модуль "Работа с файловой системой" вообще не должен знать ни о каких специальных классах вышестоящих модулей.

Как лучше сделать?
Отредактировано 22.05.2019 10:25 es3000 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.