Войти
ПрограммированиеФорумОбщее

Логгер с автоматическими секциями (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
16:16, 7 апр. 2016

Suslik
> ну ок, пусть будет так, но как для этого реализовать LoggerSection()?
Если тебе не нужны break/continue наружу секции, то это тупо макрос обертка над for, который крутится ровно один раз, т.о. ты создаешь scope по сути с "параметрами", аналогично шарповскому using.
Внутри for твой объект, который автоматом открывает новую секцию и соответственно закрывает, когда выходит из области видимости.

По сути syntax sugar. Я все скоупы с параметрами так заворачиваю, выглядит имхо понятнее. Самый очевидный пример - это локи:

lock(mutex) {
       // protected code
}
и для прочих вещей, которые требуют парных begin/end функций не разнесенных по коду/времени выполнения. Плохо, что язык не позволяет сделать это без макросов.

#31
16:19, 7 апр. 2016

d.m.k
> Если тебе не нужны break/continue наружу секции, то это тупо макрос
Suslik
> Разумеется, желательно без макросов

#32
16:27, 7 апр. 2016

Suslik
без макросов будет не красиво )

#33
16:41, 7 апр. 2016

Suslik
единственный вариант с учетом 3 пунктов из 0 поста и без макрасов возможен в таком виде

GetLogger().AutoSection("if (1)", [&](){
// todo
});
но лично для себя я не вижу проблемы использовать вариант из 0 поста обернутый в макрос для генерирующий уникальные имена переменных
#34
19:20, 7 апр. 2016

Suslik
> но хотелось бы обезопасить себя от забывания вызова Logger::SectionEnd()
RAII

#35
21:13, 7 апр. 2016

Kartonagnick
давай я тоже тебе в ответ скину какой-нибудь умный термин. например:

Kartonagnick
DGFEM

или

Kartonagnick
PGS-SOR

как бы термин-то умный и не важно, что он к вопросу относится практически никак, поэтому и против него-то ничего особо не скажешь и вроде за умного прослывёшь. но всё-таки лучше быть, наверное, немного конструктивнее, и показать кодом, как именно ты собрался парадигму RAII (которую по сути в любом случае будет реализовать scope guard, который мы тут уже 3 страницы пытаемся изобрести) приплести к решению.

ashujon
> единственный вариант с учетом 3 пунктов из 0 поста и без макрасов возможен в
> таком виде
> GetLogger().AutoSection("if (1)", [&](){
> // todo
> });
не работает с return'ом.

#36
21:57, 7 апр. 2016

Вместо цикла или лямбды в качестве обертки секции (scope) можно использовать if, благо для него разрешен частный случай объявления-создания объекта прямо в условии:

if (LoggerSection dummy = LoggerSection("section name")) {
    ...
}
И тогда будут работать и break, и continue и return. Причем если макросов не бояться, можно свернуть до очень аккуратного
SECTION("section name") {
    ...
}

#37
22:36, 7 апр. 2016

Вот, кстати, почти хорошо.
Я бы ещё, на всякий пожарный, в конец SECTION() вписал бы ещё "{}else". А то одним прекрасным днём Суслик проворонит настоящий if, а код возьмёт и скомпилируется.

#38
0:31, 8 апр. 2016

Delfigamer
> Я бы ещё, на всякий пожарный, в конец SECTION() вписал бы ещё "{}else".
Скоуп ифа убьется при входе в else, не?

#39
1:24, 8 апр. 2016

Вот специально сходил на рекстест и проверил. Нет, не убъётся.

#40
1:29, 8 апр. 2016

Cfyz
> SECTION("section name")
вроде сразу было обозначено, что если уж использовать макросы, то можно сгенерить уникальное имя временной переменной с помощью __LINE__, гарантированно не ломая ни break'и, ни return'ы, ни else'ы. собственно, так как решение с макросом уже есть, интересуют решения без них. например, интересное решение на лямбдах, но ломает всё остальное.

#41
2:22, 8 апр. 2016

Suslik
В первую очередь я предложил решение пары возникших у других проблем. Часто if для выделения RAII-секции подходит лучше, чем цикл или лямбда.

Продемонстрированный принципиальный вариант с if не использует макрос и, возможно, кто-то придумает элегантную запись; например раз уж у нас есть лямбды, то как насчет такой?

if (auto _ = "name"_section) {
    ...
}
Если бы еще if глаз не цеплял. Хотя, положа руку на ногу, голый if в таком ключе выглядит как минимум чудно.

При использовании макросов вариант с if лучше чем просто временная переменная тем, что гарантированно идет с областью видимости. Не получится объявить еще что-то до переменной, плюс можно будет писать вот так:

SECTION("name")
  InvokeSomethingBombastic();

Ну и в конце концов упоминание макроса было не для вас лично. Я же не написал кому именно отвечаю, тут куча людей еще тему обсуждают.

#42
20:09, 8 апр. 2016

Suslik
> давай я тоже тебе в ответ скину какой-нибудь умный термин. например:
нельзя ответить на вопрос, которого не было.


распространенный паттерн : локальный страж.
в конструкторе захыватывает ресурс.
в диструкторе - освобождает.

это гарантирует, что вы не забудете освободить ресурс.

#43
20:21, 8 апр. 2016

Kartonagnick
> распространенный паттерн : локальный страж.
> в конструкторе захыватывает ресурс.
> в диструкторе - освобождает.
может имеет смысл поменьше умничать и попробовать почитать вопрос, на который отвечаешь?
в нульпосте сразу был написан scope guard:
Suslik
> class SectionGuard
> {
> public:
> SectionGuard(Logger *logger, std::string sectionName);
> {
> this->logger = logger;
> logger->SectionStart(sectionName);
> }
> ~SectionGuard();
> {
> logger->SectionEnd();
> }
> };
и основным вопросом был:
> Как можно избежать придумывания ненужных имён для каждого SectionGuard'а вроде s0/s1? Разумеется, желательно без макросов и __LINE__.

#44
20:42, 8 апр. 2016

Suslik
> Как можно избежать придумывания ненужных имён для каждого SectionGuard'а вроде
> s0/s1? Разумеется, желательно без макросов и __LINE__.

нет потребности в их придумывании.
достаточного одного имени на секцию.

int bar(int v)
{
    LOGGING_THIS_FUNCTION(v);
    LOG << "ololo";
}

int foo(int v)
{
    LOGGING_THIS_FUNCTION(v);

    LOG << "bla bla bla";

    bar(10);
}

int main()
{
    LOGGING_THIS_FUNCTION();
    foo(20);
    
}
main: 
    foo: int(20)
        bar: int(10)


LOGGING_THIS_FUNCTION создает интерфейс логгера.
он связывается с ядром, и сигналит об открытии секции.
в деструкторе просигналит о закрытии.

в промежутке может быть вызвана функция,
в которой в свою очередь будут сигналы от открытии/закрытии секций.
ядро контролирует "ресурсию" интерфейсов логгера.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.