169 похожих чатов

Вопрос по организации кода. Пилю свой велосипед логгер Есть у меня

множество уровней сообщений. Я набрасываю сообщения в стринглист, а когда они нужны, вызываю их через функцию Text и указываю какие уровни показать.
Структура проекта примерно такая:
При запуске главной формы, создаётся ядро, ядро создаёт логгер и остальные модули.
Модули скидывают сообщения логов в ядро, ядро их кладёт в логгер, а главная форма по необходимости дёргает из него текст и показывает в мемо.
При отправке сообений лога, они помечаются одним из элементов множества
TLevel = (LUART, LCONSOLE, LUSER, LCOMMON, LERRORS, ALL);
которые описаны в модуле логгера.
И тут возникает вопрос. Получается, что не достаточно прописать всем модулям в юсес ядро (там процедура, которая перебрасывает сообщения в логгер), нужно ещё и логгер туда прописать.
Хз на сколько это правильно. Как тут лучше поступить?
Забить и прописать логгер во всех модулях, которые скидывают логи.
Вынести описание TLevel в отдельный модуль и уже его прописывать всем заинтересованным.
Вынести описание TLevel в ядро. Но тогда у ядара будет в юсесах логгер, а у логгера ядро, вроде как это не правильно.
Забить на отдельный тип данных, и передавать уровни цифрами. Ввести константы типа LUART=1 LCONSOLE=2 итд, и использовать их.

21 ответов

68 просмотров

Ну для этого придумали enum, типа type TLogLevel = (llInfo, llWarn, llError etc) ну и если он у тебя в type модуля прописан, то должен везде подхватываться

Serjone- Автор вопроса
Александр В
Ну для этого придумали enum, типа type TLogLevel =...

напрямую модуль логгера не подключен в другие модули. Он какбы через прокладку работает. Поэтому этот тип в других модулях не виден

Вынеси tlevel в свое "ядро" а в логгере разреши циклическую ссылку на ядро в имплементации. Если уж так не хочется отдельный модуль с tlevel делать и везде его заюзывать

Михаил Усков
Вынеси tlevel в свое "ядро" а в логгере разреши ци...

ай яйяй ненадо циклических ссылок на ровном месте

Serjone
напрямую модуль логгера не подключен в другие моду...

Чёт изврат какойт, но если что...у тебя он все равно цифры, и ты его можешь проверять как цифру

Serjone- Автор вопроса
zamtmn
ай яйяй ненадо циклических ссылок на ровном месте

Да все можно, если осторожно.... Для того (а не для скорости компиляции, как тут некоторые спорят) и нужны uses в имплементации. Ну и...Это учебный логгер, можно делать как угодно.

Стикер

Я бы создал отдельный модуль с интерфейсом, а в ядре реализовать этот интерфейс. В других модулях подключать вместо ядра модуль с интерфейсом. TLevel можно кинуть в отдельный модуль, всем его указывать в uses если это необходимо. Не вижу тут проблемы.

Дмитрий Логинов
Я бы создал отдельный модуль с интерфейсом, а в яд...

Так у него есть исходники моего логгера, в которых именно так и сделано

Поскольку у тебя прокси-функция логгера уже защита в "ядро", значит у тебя ядро от логгера зависит. Почему бы просто не добавить в ядро ещё и прокси типа? Unit ядро; Interface uses логгер; Type TLevel = логгер.TLevel;

Nik
Так у него есть исходники моего логгера, в которых...

Моё сообщение было больше про организацию кода, а не про логгер. Выделение в отдельный модуль интерфейса общения с "ядром" позволит избавиться от перекрестных ссылок (а от них избавляться нужно, уж больно много гемороя они доставляют).

Дмитрий Логинов
Моё сообщение было больше про организацию кода, а ...

У меня интерфейс логгера выделен в отдельный юнит ) Так что всё верно в том сообщении )

Serjone- Автор вопроса
Serjone
Так можно было? 😳

А ты сделай uses windows; var r: trect; А потом ctrl-клики на trect и посмотри как оно определяется. В лазаре, кстати, есть проблемы как раз когда одни и те же майкросотовские типы снова и снова определяются в разных модуля и для компилятора это разные, несовместимые типы.

Arioch The
Поскольку у тебя прокси-функция логгера уже защита...

какой в этом смысл? всеравно неявная зависимость от логгера, тогда уже делать ее явной

Serjone
Так можно было? 😳

Вообще, я же могу написать вот такие вызовы процедур? Windows.DeleteFile('1.txt'); SysUtils.DeleteFile('1.txt'); Могу. И вряд ли я сейчас кого-то удивил. А чем отличаются типы??? Там все то же самое

Arioch The
А ты сделай uses windows; var r: trect; А потом ct...

они несовместимые только если через type определены, иначе это тотже самый тип емнип

zamtmn
они несовместимые только если через type определен...

Нет,именно сто там копипастом снова и снова... В дельфе на трахались, вынесли в types и всех остальных через него маршрутизировали. Казалось бы хорошо известный и базовый приём. Странно...

zamtmn
какой в этом смысл? всеравно неявная зависимость о...

Не знаю. Он пишет, ему виднее. Даже банальное "мне так комфортнее" например

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта