Здравствуйте, 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 не укладывается в простое выражение, то возможно стоит это укладывание выделить в отдельную сущность, хотя это не всегда имеет смысл. Я ж не говорю, что есть серебряная пуля