Re[2]: [C][Trick] Resource acquisition
От: andrey.desman  
Дата: 06.04.08 18:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, andrey.desman, Вы писали:


AD>>Навеяно этим топиком: Опять goto :)
Автор: ansi
Дата: 14.01.06


AD>>В итоге имеем такой костыль:

AD>>
AD>>#define USING(alloc, free, action) \
AD>>    if (alloc)                     \
AD>>    {                              \
AD>>        action;                    \
AD>>        free;                      \
AD>>    }
AD>>


E>а чем это лучше вложенного if?

Да по сути это и есть вложенный if. А достоинства я уже описывал (сравни пример Владек'а, и на первый пример в топике):
1. Отдельные уровни вложенности как правило не требуются. Если в if не делать отступы, то читать такой код будет весьма напряжно.
2. Захват ресурса располагается на одной строке с освобождением. Т.е. фактически управление пачкой ресурсов ложится на несколько строк (несколько последовательных USING), а не размазано по функции. Освобождение ресурса не уплывает вниз при добавлении кода, а значит не потеряется из виду.
3. Отсутствие посторонних лексем (шума). В принципе у каждого ресурса две операции — захватить и освободить, на которых хорошо бы иметь визуальный акцент. С этим костылем кроме этих двух операций больше ничего толком и нет. От вложенного if же рябит в глазах.

E>Вроде бы if так же сложен, зато стандартный и запятые можно использовать и накосячить труднее...

E>Тем более, что alloc часто может не укладываться удобным образом в одно выражение...
По мне, так несколько вложенных if на порядок сложнее для восприятия по причинам, которые я указал выше. Где накосячить труднее это еще вопрос, но писать вложенные if сложнее.
Если alloc не укладывается в простое выражение, то возможно стоит это укладывание выделить в отдельную сущность, хотя это не всегда имеет смысл. Я ж не говорю, что есть серебряная пуля
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.