do while false


“Делать пока ложно”.

Пару дней назад пытался кратко рассказать товарищу через аську про использование
do { } while(false); для переписывания длинных ветвящихся if-ов.

Кратко объяснить не получилось, в итоге решил написать в блоге.

Метод довольно спорный, хотя и встречается в некоторых авторитетных источниках (например
в “Совершенном Коде” С. Макконела).

Идея довольно простая.
0. Код помещаем в “do { …много_кода… } while(false);” блок. Если что-то не так вызываем break.
1. Оператор break перекинет нас в конец блока do.
2. Поскольку указан while(false), то повторного выполнения кода не будет.

Конечно можно использовать для таких целей исключения, вспомогательные переменные и т.д., но думаю полезно знать и про такой способ, ведь некоторые его используют.
Обычно он подходит для ситуаций когда идут ветвящиеся проверки if-else, а потом (если все хорошо) делается что-то сложное или важное.

Примитивный (выдуманный) пример:

        boolean error = false;
        if (x > 10) {
            error = true;
        } else if (x > 0 && x < = 10) {
            y = foo();
            if (y > 0 && y < 10) {
                error = true;
            } else {
                x = y;
            }
        } // много if-else кода
        
        if (!error) {
            doSomething(x, y);
        }

С помощью break-ов такой код приобретает более понятный (не для всех!) вид.

    do {
            if (x > 10) {
                break;
            } 
            
            if (x > 0 && x < = 10) {
                y = foo();
                if (y > 0 && y < 10) {
                    break;
                } else {
                    x = y;
                }
            }
            // много кода для проверок
            doSomething(x, y);
        } while (false);
Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com