OberonCore https://forum.oberoncore.ru/ |
|
История с несколькими моралями (в том числе анти-FOR) https://forum.oberoncore.ru/viewtopic.php?f=7&t=1443 |
Страница 4 из 7 |
Автор: | Alexey_Donskoy [ Вторник, 07 Апрель, 2009 15:41 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Ну, на это даже я развожу руками... Влад, Вы определённо прикалываетесь? Я беру молоток и использую по назначению. При этом я должен быть уверен в том, что при ударе не будет побочных эффектов вроде разлетания молотка на трассирующие осколки Если я использую процедуру, то я должен быть уверен в том, что она делает именно то, что написано в описании. Если я использую итератор, то для всех - значит именно для всех. P.S. Но всё-таки она вертится! И я привык ещё к одной разновидности итератора: FindFirst ! И если он делает то, что значится в описании, то мне глубоко пофиг, есть ли там return или где |
Автор: | Alexey_Donskoy [ Вторник, 07 Апрель, 2009 15:43 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Чего ж вы про механизм исключений тогда скажете? Хе-хе Скажу, что использование исключений - это плохой дизайн системы.В идеале каждая ошибка должна быть обработана явно (смайлик на всякий случай, потому что... см. темы про Дракон и иже с ним). |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 15:45 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Axcel писал(а): Ну, а я считаю, по хорошему цикл FOR должен быть составной частью общего с WHILE цикла. Т.е. FOR это не самостоятельный цикл, а просто специальное средство для работы с индексами. FOR i:= 0 TO Count-1 WHILE "условие f(i)" DO ... END; Да, что-то подобное я и имел ввиду, когда говорил о принесении Дейкстры в жертву практике при существующем синтаксисе языка. Будет более другой синтаксис - можно запрещать и RETURN из FOR |
Автор: | Валерий Лаптев [ Вторник, 07 Апрель, 2009 15:49 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): В каком месте FOR c RETURN противоречит структурному программированию? При том, что он тривиально может быть преобразован к FOR без RETURN? P.S. Чего ж вы про механизм исключений тогда скажете? Хе-хе В Обероне исключений просто нет, в ББ - тоже. Но говорить о полезности и вредности можно только после того, как попробуешь и с исключениями, и без них. Возможно, в ББ просто не возникает необходимости в исключениях? Хотя вряд ли. Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем. |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 15:49 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Alexey_Donskoy писал(а): Ну, на это даже я развожу руками... Влад, Вы определённо прикалываетесь? По поводу чего именно? По поводу большей читабельности FOR с RETURN для ряда ситуаций - нет, не прикалываюсь. Alexey_Donskoy писал(а): Если я использую итератор, то для всех - значит именно для всех. Блин. Просто FOR - это не итератор для всех. Это генератор индексов Итератор для всех - это std::for_each. Alexey_Donskoy писал(а): И я привык ещё к одной разновидности итератора: FindFirst ! Не понял про что вы... |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 15:53 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Alexey_Donskoy писал(а): Vlad писал(а): Чего ж вы про механизм исключений тогда скажете? Хе-хе Скажу, что использование исключений - это плохой дизайн системы.Без комментариев Alexey_Donskoy писал(а): В идеале каждая ошибка должна быть обработана явно (смайлик на всякий случай, потому что... см. темы про Дракон и иже с ним). В случае исключений мы как раз и имеем явную обработку ошибок. В отличие от ситуации, когда ошибки и "полезные" результаты обрабатываются одинаковом способом (оберон, C). |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 15:56 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Валерий Лаптев писал(а): Возможно, в ББ просто не возникает необходимости в исключениях? Хотя вряд ли. Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем. ASSERT P.S. Хотя на самом деле там должен стоять вот такой смайлик - |
Автор: | Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 15:59 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Alexey_Donskoy писал(а): Если я использую итератор, то для всех - значит именно для всех. Блин. Просто FOR - это не итератор для всех. Это генератор индексов Чушь. Сама фраза FOR i := 0 TO 99 DO говорит о том, что i будет изменяться от 0 до 99. То есть, цикл прокрутится 100 раз. Если поставить RETURN, то цикл НЕ прокрутится 100 раз. Выразить фразу по другому: Код: Для значений индекса от 0 до 99 сделай ... конец Смысл фразы в том, что последнее значение индекса должно быть 99. А RETURN внутри этого - костыль для убогих. |
Автор: | Alexey_Donskoy [ Вторник, 07 Апрель, 2009 16:01 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Блин. Просто FOR - это не итератор для всех. Это генератор индексов Итератор для всех - это std::for_each. В этом тоже что-то есть! for - это foreach для заданного диапазона индексов. SQL Select такой специфический Vlad писал(а): Alexey_Donskoy писал(а): И я привык ещё к одной разновидности итератора: FindFirst ! Не понял про что вы...Для Ильи Ермакова - а вот как правильно поступить в случае, когда нужен поиск в заданном диапазоне индексов? Задавать начальное значение индекса до while и усложнять условие проверкой конечного значения индекса? Это будет плохо, потому что диапазон отсутствует в явном виде! |
Автор: | Algo [ Вторник, 07 Апрель, 2009 16:02 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Неправда. Границы в случае FOR как раз явно заданы (в отличие от WHILE, где они смешаны с "полезным" условием выхода). Так что анализировать надо больше в случае WHILE. О чем я и говорю с самого начала Что значит границы смешаны с полезным условием выхода (i < count) AND NOT <полезное условие> То, что они разделены AND? Т.е. нужен такой набор разделителей FOR ... DO IF <полезное условие> THEN RETURN END ? |
Автор: | Alexey_Donskoy [ Вторник, 07 Апрель, 2009 16:04 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): В случае исключений мы как раз и имеем явную обработку ошибок. Отнюдь!В случае исключений имеет место "обобщённая" обработка ошибок - вроде "средней температуры по больнице"! |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 16:07 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Иван Кузьмицкий писал(а): Чушь. Сама фраза FOR i := 0 TO 99 DO говорит о том, что i будет изменяться от 0 до 99. Будете в переводе с английского упражняться или примите FOR в таком в виде в каком он есть? А если вместо трех букв FOR будет три буквы GEN - сильно полегчает? |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 16:12 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Alexey_Donskoy писал(а): Про то же, что и Вы - паттерн такой, существовавший, например, в Turbo Vision в явном виде (FirstThat). Где явно выделен сам вызов итератора, с его назначением, и функция, реализующая условие поиска. А. Так я с этим паттерном уже всем здесь надоел std::find и std::find_if навсегда И не надо никаких RETURN из FOR |
Автор: | Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 16:21 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Не зря FOR оставили Толку немного, зато есть обо что языки почесать. |
Автор: | Algo [ Вторник, 07 Апрель, 2009 16:24 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): В каком месте FOR c RETURN противоречит структурному программированию? При том, что он тривиально может быть преобразован к FOR без RETURN? Структурное программирование предполагает, что программа состоит из блоков операторов, которые либо выполняются либо не выполняются целиком. Предполагается, что такой подход значительно упрощает чтение и понимание текста программы. GOTO, RETURN, BREAK, CONTINUE в глубине любого блока прерывает эту структуность. Обсуждаемый здесь пример из за своей просты не может показать преимущества стуктурного подхода. Допустим, что тело цикла - 15-20 строк. Если всё уловие продолжнения цикла будет записано сразу после WHILE, понять работу цикла гораздо проще и сразу становится понятным когда он завершится. Если же где то в парочке вложенных IF-в, на 18 строке цикла можно вставить RETURN, всё будет наоборот. Для анализа работы понадобится полный просмотр тела цикла. Vlad писал(а): P.S. Чего ж вы про механизм исключений тогда скажете? Хе-хе Исключения это исключение . Вслучае единственности такого исключения из правил, оно терпимо. Но оберонщики без него обходятся . Иван Кузьмицкий писал(а): Не зря FOR оставили Толку немного, зато есть обо что языки почесать. +5 |
Автор: | Vlad [ Вторник, 07 Апрель, 2009 16:32 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Alexey_Donskoy писал(а): Vlad писал(а): В случае исключений мы как раз и имеем явную обработку ошибок. Отнюдь!В случае исключений имеет место "обобщённая" обработка ошибок - вроде "средней температуры по больнице"! Поясните свою мысль. Я не пониманию аналогии. |
Автор: | Info21 [ Вторник, 07 Апрель, 2009 16:39 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Валерий Лаптев писал(а): Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем. Files полон примеров на сей счет.
|
Автор: | Vlad [ Вторник, 07 Апрель, 2009 16:42 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Algo писал(а): Структурное программирование предполагает, что программа состоит из блоков операторов, которые либо выполняются либо не выполняются целиком. Предполагается, что такой подход значительно упрощает чтение и понимание текста программы. GOTO, RETURN, BREAK, CONTINUE в глубине любого блока прерывает эту структуность. RETURN, BREAK, CONTINUE - не прерывают, потому что их "действие" ограничивается текущим блоком. В отличие от GOTO, который никак не привязан к блоку. Algo писал(а): Обсуждаемый здесь пример из за своей просты не может показать преимущества стуктурного подхода. Допустим, что тело цикла - 15-20 строк. Не надо писать такие циклы. Серьезно. Одна, две, максимум - три строки. Algo писал(а): Если всё уловие продолжнения цикла будет записано сразу после WHILE, понять работу цикла гораздо проще и сразу становится понятным когда он завершится. Не, не становится. Потому что условие - трехэтажное выражение с 10 переменными, модификация которых плавно размазана по всем 20 строкам. |
Автор: | Algo [ Вторник, 07 Апрель, 2009 17:10 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): RETURN, BREAK, CONTINUE - не прерывают, потому что их "действие" ограничивается текущим блоком. В отличие от GOTO, который никак не привязан к блоку. Тем не менее у них нет строгого положения в блоке и структурность они всё равно нарушают. Vlad писал(а): Не, не становится. Потому что условие - трехэтажное выражение с 10 переменными, модификация которых плавно размазана по всем 20 строкам. Почему то, обычно, условия даже для длинных циклов трёх этажными не становятся. Ещё есть возможность, в соответствии с задачами, возлагаемыми на тело цикла, ввести доп. логические переменные, которые условие сократят но не ухудшат понимания. Перефразируя одного известного человека, можно сказать "Не надо писать такие условия. Серьезно. Одна, две, максимум - три строки." Если циклы должны быть на 1-2 строки, о чём вообще тогда сыр бор? Ратовать за то, чтобы в место "AND NOT <условие>" писать "IF <условие> THEN RETRUN"? И ради таких простых однострочных циклов заводить FOR, BREAK, CONTINUE и RETURN? Получается 2 варианта: либо ухудшение читабельности, либо просто бессмысленное введение терминов, на проблему, не стоящую выеденного яйца. |
Автор: | Madzi [ Вторник, 07 Апрель, 2009 17:18 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
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; |
Страница 4 из 7 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |