Vlad писал(а):
Algo писал(а):
Структурное программирование предполагает, что программа состоит из блоков операторов, которые либо выполняются либо не выполняются целиком. Предполагается, что такой подход значительно упрощает чтение и понимание текста программы.
GOTO, RETURN, BREAK, CONTINUE в глубине любого блока прерывает эту структуность.
RETURN, BREAK, CONTINUE - не прерывают, потому что их "действие" ограничивается текущим блоком. В отличие от GOTO, который никак не привязан к блоку.
Прерывают. И я не понимаю почему вы упорствуете. Правило структурности для блока (за исключением условного блока): 1 вход 1 выход, в блоке только простые операции. В случае RETURN получается второй выход из блока. Собственно BREAK и CONTINUE, так же соответствуют второму выходу, но менее явно.
Vlad писал(а):
Algo писал(а):
Если всё уловие продолжнения цикла будет записано сразу после WHILE, понять работу цикла гораздо проще и сразу становится понятным когда он завершится.
Не, не становится. Потому что условие - трехэтажное выражение с 10 переменными, модификация которых плавно размазана по всем 20 строкам.
Просто нужно грамотно условие выхода составлять, чтобы оно было понятно при обозрении, а не запутывать умышленно.
Я уже говорил выше. Никто не запрещает писать FOR с RETURN, или пользоваться GOTO, но при этом не нужно говорить что программа структурная. Преимущества структурного подхода давно доказаны, поэтому спорить по этому поводу не вижу смысла.
По поводу исключений скажу следующее: любое исключение это тот же самый GOTO на обработку ошибок (отложенная обработка). Появились исключения не от хорошей жизни, а от упавшего уровня программистов разработчиков, которые вместо грамотного построения программы "ловят" ошибки на выходе.
Рассмотрим пример:
try {
foo ();
} catch (Exception e) {
...
} // Java
Функция foo (); содержит (может содержать) ошибку, в результате которой возникает исключение. Есть механизмы определить что это за ошибка (хотя можно привести пример, когда одна и та же ошибка может возникать в двух разных местах процедуры foo (); и требовать разной обработки). Несомненно, что исключения нужны для того, чтобы иметь возможность обработать ошибку. Этим занимается секция catch. В случае когда мы ЗНАЕМ какие ошибки могут возникнуть в foo ();, то мы МОЖЕМ написать адекватную процедуру обработки (но могут быть случаи, когда зная написать адекватную процедуру мы не можем (когда одна и та же ошибка может возникнуть в разных местах)). Если мы НЕ ЗНАЕМ какие ошибки могут возникнуть в foo (); (например библиотека стороннего разработчика и он открыл только часть исключений), то грамотно обработать ситуацию мы не можем.
Пример 1:
try {
a = x / y;
} catch (Exception e) {
System.out.writeln("Деление на нуль.");
}
Пример 2:
IF x = 0
THEN Out.String("Делитель равен нулю"); Out.Ln;
ELSE a = x / y;
END;