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

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

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

21 ответов

72 просмотра

Ну для этого придумали 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
какой в этом смысл? всеравно неявная зависимость о...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта