OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 14 Декабрь, 2019 02:10

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 135 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 07 Апрель, 2009 17:31 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Algo писал(а):
Тем не менее у них нет строгого положения в блоке и структурность они всё равно нарушают.


Нет, не нарушают. Или по-вашему IF/ELSE тоже нарушает, потому что у ELSE нет строгого положения в блоке? :) Рассматривайте FOR с BREAK как один блок с соответствующей семантикой. И процедуру с RETURN - тоже как один блок.

Algo писал(а):
Vlad писал(а):
Не, не становится. Потому что условие - трехэтажное выражение с 10 переменными, модификация которых плавно размазана по всем 20 строкам.

Почему то, обычно, условия даже для длинных циклов трёх этажными не становятся.


Ну конечно. А с какого примера все началось в этой теме? :) Или это условие не считается трехэтажным?

Vlad писал(а):
Ещё есть возможность, в соответствии с задачами, возлагаемыми на тело цикла, ввести доп. логические переменные, которые условие сократят но не ухудшат понимания.


С этим тоже есть проблема. Такие переменные нужно инициализировать до цикла и внутри цикла. Причем зачастую одинаковым способом. Это ведет к дублированию и разбуханию кода. Чтобы там не говорили о принципиальной разнице между "инициализацией" цикла и вычислением следующего шага.

Vlad писал(а):
Если циклы должны быть на 1-2 строки, о чём вообще тогда сыр бор?


Сыр-бор о догматичности :) А именно о занесении RETURN из FOR в разряд "плохих" конструкций, вплоть до исключения из языка в пользу обобщенного WHILE. Мне кажется такой подход неправильным. Во всяком случае до предложения "другого" WHILE, не уступающему в читабельности такому FOR.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 17:48 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Madzi писал(а):
Прерывают.


Не прерывают. См. мой ответ Algo.

Madzi писал(а):
Просто нужно грамотно условие выхода составлять, чтобы оно было понятно при обозрении, а не запутывать умышленно.


Так я ж уже упоминал, что как раз стремление записать условие в одном месте и не дает сделать его наглядным. Вкупе с секцией VAR :)

Madzi писал(а):
Я уже говорил выше. Никто не запрещает писать FOR с RETURN, или пользоваться GOTO, но при этом не нужно говорить что программа структурная. Преимущества структурного подхода давно доказаны, поэтому спорить по этому поводу не вижу смысла.


Я не собираюсь спорить с преимуществом структурного подхода. Я принципиально против приравнивания RETURN к GOTO.

Madzi писал(а):
По поводу исключений скажу следующее: любое исключение это тот же самый GOTO на обработку ошибок (отложенная обработка). Появились исключения не от хорошей жизни, а от упавшего уровня программистов разработчиков, которые вместо грамотного построения программы "ловят" ошибки на выходе.


Гы :) Опять без комментариев %) Почитайте про механизм исключений хоть в википедии, что-ли... А то слова try/catch знаете, а зачем это нужно и какие проблемы призвано решать - нет.

Madzi писал(а):
Если мы НЕ ЗНАЕМ какие ошибки могут возникнуть в foo (); (например библиотека стороннего разработчика и он открыл только часть исключений), то грамотно обработать ситуацию мы не можем.


Ужас :) И чем это отличается от ситуации, когда вместо "неизвестного" исключения возвращается "неизвестный" INTEGER? Ну кроме того, что INTEGER можно забыть проверить и полезной информации из него вытащить можно намного меньше? :)
(2Alexey_Donskoy: не, ну как тут не прикалываться, а? :)


Madzi писал(а):
Пример 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;


Э... И к чему эти примеры?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:01 

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
2 Vlad
Больно в ваших сообщениях много смаликов. Уж не прикалываетесь ли вы сударь.
Разборки на тему почему IF THEN ELSE структурный оператор, а GOTO и Ко не структурные это уже за границами моего интереса...

В приведённом примере условие (из трёх неравенств) не трёх этажное. В моём понимании этажность с количеством строк коррелирует.

И всё же непонятна ваша просветительская роль в борьбе с догмами. Зачем нужна туча конструкций для реализации циклов, которые будут занимать 1-2 две строки? В чём выражается сложность восприятия какого либо варианта программы, если текста физически мало? Какой нибудь объективный критерий этой сложности можете указать?
Я уже высказался в защиту чистого WHILE: в все основные характеристики цикла сосредоточены в одном месте, и в случае не однострочного цикла - анализировать проще.


Последний раз редактировалось Algo Вторник, 07 Апрель, 2009 19:16, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:13 

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
2 Madzi
Интересны (действительно интересны) Ваши рассуждения на счёт исключительных ситуаций.
Как вы предлагаете обрабатывать такие ситуации:
1. Процедуры вызывают друг друга: A->B-> ... Z. В Z возникает проблема, которую имеет смысл решать только в A, цепочку вызовов же следует просто прервать. Раздувать код проверками в каждой процедуре?

2. Где-то, в глубине программы произошла ошибка, обработки которой по методике "без-исключений" предусмотрено не было (ну не учли). Ошибка не фатальная, можно было бы отменить часть действий и пойдти дальше. Как это реализовать без исключений?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:30 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Algo писал(а):
Больно в ваших сообщениях много смаликов. Уж не прикалываетесь ли вы сударь.


Местами, когда оппонент заявляет, что "исключения появились от упавшего уровня программистов" или т.п. чушь. Но по поводу FOR и RETURN я вполне серьезно.

Algo писал(а):
В приведённом примере условие (из трёх неравенств) не трёх этажное. В моём понимании этажность с количеством строк коррелирует.


Приведенный пример через FOR с RETURN записывается понятнее. Условие упрощается. Вот и все.

Algo писал(а):
И всё же непонятна ваша просветительская роль в борьбе с догмами. Зачем нужна туча конструкций для реализации циклов, которые будут занимать 1-2 две строки? В чём выражается сложность восприятия какого либо варианта программы, если текста физически мало? Какой нибудь объективный критерий этой сложности можете указать?
Я уже высказался в защиту чистого WHILE: все основные характеристики цикла сосредоточены в одном месте, анализировать проще.


Я уже тоже сказал, почему WHILE не заменяет FOR. FOR - явно выражает итерацию по диапазону. WHILE - нет. FOR - высокоуровневая конструкция. WHILE - ассемблер. Я в своей практике использую еще более высокоуровневые конструкции - find, for_each, filter, transform, которые я не хочу писать через WHILE или FOR по той же причине.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Vlad писал(а):
Ну конечно. А с какого примера все началось в этой теме? :) Или это условие не считается трехэтажным?

У меня слов нет. Честно. Если у Вас большие проблемы с обычными логическими выражениями, то стоит ли так долго буянить? По-детски это как-то выходит... Студенты-прогульщики вот так на "чёртовы формулы" обижаются обычно. Других ассоциаций в голову нейдёт...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Vlad писал(а):
Приведенный пример через FOR с RETURN записывается понятнее. Условие упрощается. Вот и все.

Да ни хрена он не понятней. Программа должна читаться "между строк", т.е. по условиям, которые выполняются между операторами. (другой, обычный вариант - читается как есть и прогоняется "в уме", как если бы её выполнял комп).
Мне НАДО видеть условие целиком. Вот эту самую конъюнкцию. И я не собираюсь её восстанавливать по частям из Ваших RETURN. Тем более гонять в уме цикл. Мне наплевать, как его будет выполнять компьютер, мне важно знать, какое "уравнение" из предикатов он итерационно решает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:43 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Vlad писал(а):
Приведенный пример через FOR с RETURN записывается понятнее. Условие упрощается. Вот и все.
viewtopic.php?p=27092#p27092

Который уже круг? Сколько я пропустил? :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 19:49 

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
Vlad писал(а):
Я уже тоже сказал, почему WHILE не заменяет FOR. FOR - явно выражает итерацию по диапазону. WHILE - нет. FOR - высокоуровневая конструкция. WHILE - ассемблер. Я в своей практике использую еще более высокоуровневые конструкции - find, for_each, filter, transform, которые я не хочу писать через WHILE или FOR по той же причине.

Только не надо сваливаться в другую тему. Для реализации этих конструкций достаточно наличия анонимных методов. Но здесь не о filter речь, а о WHILE против FOR+RETURN.

Вы сказали, что циклы должны быть на 1-3 строчки. Ладно, я это не обсуждаю, завернём всё по процедурам и функциям, бог с ним. Как программа из 3-х строчек, решающая одну и ту же задачу с WHILE может быть сложнее для восприятия чем с FOR+RETURN? Пусть while - ассемблер, пусть. Но какая разница если программа короткая? Как для программиста может быть настолько сложным логическое выражение из трёх неравенств? Неужели их понимание не является одним из важнейших в деятельности программиста?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 20:41 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Algo писал(а):
Как для программиста может быть настолько сложным логическое выражение из трёх неравенств? Неужели их понимание не является одним из важнейших в деятельности программиста?


Логическое выражение из трех неравенств сложнее логического выражения из двух неравенств. Чисто количественно. Плюс разделение разных по смыслу действий - итерации и проверки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 20:44 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Vlad писал(а):
Логическое выражение из трех неравенств сложнее логического выражения из двух неравенств. Чисто количественно. Плюс разделение разных по смыслу действий - итерации и проверки.

Нет никаких действий. Есть единый процесс. И единое логическое "уравнение".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 20:46 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Мне НАДО видеть условие целиком.


А как же "разделяй и властвуй"? Или к циклам этот принцип не относится?

Илья Ермаков писал(а):
Вот эту самую конъюнкцию. И я не собираюсь её восстанавливать по частям из Ваших RETURN. Тем более гонять в уме цикл. Мне наплевать, как его будет выполнять компьютер, мне важно знать, какое "уравнение" из предикатов он итерационно решает.


Да никто не гоняет в уме цикл. Видят цикл FOR - итерация по диапазону. Видят RETURN - возврат из функции. Сразу видно диапазон. Сразу видно по какому условию возврат.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 20:47 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Нет никаких действий. Есть единый процесс. И единое логическое "уравнение".


Это в вашей терминологии это единый процесс с единой проверкой. Приводящий в определенных случаях к нечитаемому коду.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 20:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Vlad писал(а):
А как же "разделяй и властвуй"? Или к циклам этот принцип не относится?

Ну ядрёна вошь, что разделять-то? То, что должно восприниматься целостно?
Ну, Влад у нас и спорщик. :) Он тут удовлетворяет сразу две цели: любопытство и любовь поспорить до у.. до упору...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Ну ядрёна вошь, что разделять-то? То, что должно восприниматься целостно?


Ну блин. Вот я напишу целостную программу в целостном файле на 10 мегабайт текста. И скажу сопровождающему программисту - программа должна восприниматься как одно целое.

Илья Ермаков писал(а):
Ну, Влад у нас и спорщик. :) Он тут удовлетворяет сразу две цели: любопытство и любовь поспорить до у.. до упору...


Я всего лишь высказываю свое ИМХО. Основанное на чтении многих мегабайтов кода.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Vlad писал(а):
Я всего лишь высказываю свое ИМХО. Основанное на чтении многих мегабайтов кода.

Замечательно, все поняли, ИМХО хорошо известно. Оно аргументировано в рамках общепринятого в ИТ контекста понимания. И стиля составления алгоритмов.
Но речь о другой ситуации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Руки прочь от FOR (и от WHILE тоже)!
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:30 

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
Наблюдаю непрекращающуюся дискуссию про FOR и WHILE. Да, интересно.
Непонятно только - зачем противопоставлять одни конструкции языка другим?

Вполне можно варьировать употребление в зависимости от ситуации,
удобства, читаемости, вкуса, опыта, пристрастий (начальника),
гибкости (мышления), закостенелости (пальцев)... И ссылаясь на
многогранность мира радоваться, что в Обероне молодой Вирт не
ограничился одним только WHILE (хотя мог бы).

А вообще, как мне кажется, корень проблемы - недостаток или неполноценность
имеющегося FOR - отсутствие операторов BREAK и CONTINUE. Поэтому остаётся
пользоваться суррогатным RETURN в качестве выхода и из процедуры тоже!

На мой взгляд методологически более правильно:
1) когда диапазон известен на момент запуска цикла - использовать FOR
(вываливаться по RETURN если результат уже известен, но ещё не конец,
т.к. не заложен! штатный BREAK и нет другого способа);

2) если с помощью FOR не удаётся - границы неизвестны, нелинейные
приращения индекса, и т.п. - то использовать WHILE.

В общем случае я бы характеризовал цикл FOR как более компактный,
жёсткий, определённый, наглядный и надёжный;

тогда как WHILE - гибче, допускает больший произвол, требует большей
внимательности, легче ошибиться, - а потому более ненадёжный и опасный.

... Д.Кнут писал на асемблере, пользовал метки и "GOTO", и оттого его
алгоритмы не стали хуже. Структурность не догма, и думаю не стоит
размахивать ею как жупелом. Ну а истина скорее где-то посередине.

[size=150][/size]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:31 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Илья, повторяю свой вопрос - как быть в случае необходимости работы с диапазоном индексов?
FOR определяет и показывает этот диапазон в явном виде.
WHILE размазывает этот диапазон так, что трудно увидеть и собрать. Эргономика, однако!

P.S. Это просто к апологетике FOR; досрочный выход из цикла - другая тема...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
Ну, напишите раздельно присваивание начального значения, а границы выделите шрифтом в исходнике. Жирненьким. Правда, не всякая среда программирования позволяет такую штуку, как оформление исходника по смыслу :)

Стоп. Вы вообще про без досрочного выхода? Ну, используйте FOR - почему нет-то...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Руки прочь от FOR (и от WHILE тоже)!
СообщениеДобавлено: Вторник, 07 Апрель, 2009 21:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9165
Откуда: Россия, Орёл
sia писал(а):
Непонятно только - зачем противопоставлять одни конструкции языка другим?

Ещё раз и снова попёрло. Хоть ветку закрывай.
Ну хоть ап стену биццца - но одни конструкции соответствуют математическому пониманию алгоритмов, которое должно быть в голове у каждого программёра, а другие - нет. Они не плохи и не хороши. Они просто - призраки, которых нет... Не возникают при составлении алгоритма как должно.

Касательно Вирта - хоть бы думали, прежде чем писать. 55 лет - молодой? С 5 языками за спиной - тем более. Именно потому цикла FOR в Виртовском Обероне как раз НЕТ.

Дональд Кнут выполнял работу по собиранию и упорядочиванию коллекции алгоритмов. Какое это отношение имеет к вопросу обоснования программирования, которым занимались другие учёные?
Просто Кнут на каждой уважающей себя полке таки стоит, а Дейкстра, к сожалению, нет. Не такая внушительная книжка - да и как-то гораздо меньше издавались.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 135 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB