OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 08 Декабрь, 2019 05:16

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




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

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Ну, на это даже я развожу руками... Влад, Вы определённо прикалываетесь? :)

Я беру молоток и использую по назначению. При этом я должен быть уверен в том, что при ударе не будет побочных эффектов вроде разлетания молотка на трассирующие осколки :)

Если я использую процедуру, то я должен быть уверен в том, что она делает именно то, что написано в описании.

Если я использую итератор, то для всех - значит именно для всех.


P.S. Но всё-таки она вертится!

И я привык ещё к одной разновидности итератора: FindFirst !
И если он делает то, что значится в описании, то мне глубоко пофиг, есть ли там return или где :D


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

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Vlad писал(а):
Чего ж вы про механизм исключений тогда скажете? Хе-хе :)
Скажу, что использование исключений - это плохой дизайн системы.
В идеале каждая ошибка должна быть обработана явно :)
(смайлик на всякий случай, потому что... см. темы про Дракон и иже с ним).


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Axcel писал(а):
Ну, а я считаю, по хорошему цикл FOR должен быть составной частью общего с WHILE цикла. Т.е. FOR это не самостоятельный цикл, а просто специальное средство для работы с индексами.
FOR i:= 0 TO Count-1 WHILE "условие f(i)" DO ... END;


Да, что-то подобное я и имел ввиду, когда говорил о принесении Дейкстры в жертву практике при существующем синтаксисе языка. Будет более другой синтаксис - можно запрещать и RETURN из FOR :)


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Vlad писал(а):
В каком месте FOR c RETURN противоречит структурному программированию? При том, что он тривиально может быть преобразован к FOR без RETURN?

P.S. Чего ж вы про механизм исключений тогда скажете? Хе-хе :)

В Обероне исключений просто нет, в ББ - тоже.
Но говорить о полезности и вредности можно только после того, как попробуешь и с исключениями, и без них. Возможно, в ББ просто не возникает необходимости в исключениях?
Хотя вряд ли. Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Alexey_Donskoy писал(а):
Ну, на это даже я развожу руками... Влад, Вы определённо прикалываетесь? :)


По поводу чего именно? :) По поводу большей читабельности FOR с RETURN для ряда ситуаций - нет, не прикалываюсь.

Alexey_Donskoy писал(а):
Если я использую итератор, то для всех - значит именно для всех.


Блин. Просто FOR - это не итератор для всех. Это генератор индексов :) Итератор для всех - это std::for_each.

Alexey_Donskoy писал(а):
И я привык ещё к одной разновидности итератора: FindFirst !


Не понял про что вы...


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Alexey_Donskoy писал(а):
Vlad писал(а):
Чего ж вы про механизм исключений тогда скажете? Хе-хе :)
Скажу, что использование исключений - это плохой дизайн системы.


Без комментариев :)

Alexey_Donskoy писал(а):
В идеале каждая ошибка должна быть обработана явно :)
(смайлик на всякий случай, потому что... см. темы про Дракон и иже с ним).


В случае исключений мы как раз и имеем явную обработку ошибок. В отличие от ситуации, когда ошибки и "полезные" результаты обрабатываются одинаковом способом (оберон, C).


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Валерий Лаптев писал(а):
Возможно, в ББ просто не возникает необходимости в исключениях?
Хотя вряд ли. Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем.


ASSERT :)

P.S. Хотя на самом деле там должен стоять вот такой смайлик - :(


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

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Vlad писал(а):
Alexey_Donskoy писал(а):
Если я использую итератор, то для всех - значит именно для всех.


Блин. Просто FOR - это не итератор для всех. Это генератор индексов :)


Чушь. Сама фраза FOR i := 0 TO 99 DO говорит о том, что i будет изменяться от 0 до 99. То есть, цикл прокрутится 100 раз. Если поставить RETURN, то цикл НЕ прокрутится 100 раз.
Выразить фразу по другому:
Код:
Для значений индекса от 0 до 99 сделай ... конец

Смысл фразы в том, что последнее значение индекса должно быть 99. А RETURN внутри этого - костыль для убогих.


Последний раз редактировалось Иван Кузьмицкий Вторник, 07 Апрель, 2009 16:04, всего редактировалось 2 раз(а).

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

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Vlad писал(а):
Блин. Просто FOR - это не итератор для всех. Это генератор индексов :) Итератор для всех - это std::for_each.
В этом тоже что-то есть! for - это foreach для заданного диапазона индексов. SQL Select такой специфический :)

Vlad писал(а):
Alexey_Donskoy писал(а):
И я привык ещё к одной разновидности итератора: FindFirst !
Не понял про что вы...
Про то же, что и Вы - паттерн такой, существовавший, например, в Turbo Vision в явном виде (FirstThat). Где явно выделен сам вызов итератора, с его назначением, и функция, реализующая условие поиска.

Для Ильи Ермакова - а вот как правильно поступить в случае, когда нужен поиск в заданном диапазоне индексов? Задавать начальное значение индекса до while и усложнять условие проверкой конечного значения индекса? Это будет плохо, потому что диапазон отсутствует в явном виде!


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

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
Vlad писал(а):
Неправда. Границы в случае FOR как раз явно заданы (в отличие от WHILE, где они смешаны с "полезным" условием выхода). Так что анализировать надо больше в случае WHILE. О чем я и говорю с самого начала :)



Что значит границы смешаны с полезным условием выхода
(i < count) AND NOT <полезное условие>
То, что они разделены AND? Т.е. нужен такой набор разделителей
FOR ... DO IF <полезное условие> THEN RETURN END ?


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

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Vlad писал(а):
В случае исключений мы как раз и имеем явную обработку ошибок.
Отнюдь!
В случае исключений имеет место "обобщённая" обработка ошибок - вроде "средней температуры по больнице"! :D


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Иван Кузьмицкий писал(а):
Чушь. Сама фраза FOR i := 0 TO 99 DO говорит о том, что i будет изменяться от 0 до 99.


Будете в переводе с английского упражняться или примите FOR в таком в виде в каком он есть? :) А если вместо трех букв FOR будет три буквы GEN - сильно полегчает? :)


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Alexey_Donskoy писал(а):
Про то же, что и Вы - паттерн такой, существовавший, например, в Turbo Vision в явном виде (FirstThat). Где явно выделен сам вызов итератора, с его назначением, и функция, реализующая условие поиска.


А. Так я с этим паттерном уже всем здесь надоел :) std::find и std::find_if навсегда :) И не надо никаких RETURN из FOR :)


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

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Не зря FOR оставили :) Толку немного, зато есть обо что языки почесать.


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

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
Vlad писал(а):
В каком месте FOR c RETURN противоречит структурному программированию? При том, что он тривиально может быть преобразован к FOR без RETURN?

Структурное программирование предполагает, что программа состоит из блоков операторов, которые либо выполняются либо не выполняются целиком. Предполагается, что такой подход значительно упрощает чтение и понимание текста программы.
GOTO, RETURN, BREAK, CONTINUE в глубине любого блока прерывает эту структуность.
Обсуждаемый здесь пример из за своей просты не может показать преимущества стуктурного подхода.
Допустим, что тело цикла - 15-20 строк. Если всё уловие продолжнения цикла будет записано сразу после WHILE, понять работу цикла гораздо проще и сразу становится понятным когда он завершится.
Если же где то в парочке вложенных IF-в, на 18 строке цикла можно вставить RETURN, всё будет наоборот. Для анализа работы понадобится полный просмотр тела цикла.
Vlad писал(а):
P.S. Чего ж вы про механизм исключений тогда скажете? Хе-хе :)

Исключения это исключение :). Вслучае единственности такого исключения из правил, оно терпимо. Но оберонщики без него обходятся :).
Иван Кузьмицкий писал(а):
Не зря FOR оставили Толку немного, зато есть обо что языки почесать.

+5


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Alexey_Donskoy писал(а):
Vlad писал(а):
В случае исключений мы как раз и имеем явную обработку ошибок.
Отнюдь!
В случае исключений имеет место "обобщённая" обработка ошибок - вроде "средней температуры по больнице"! :D


Поясните свою мысль. Я не пониманию аналогии.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8209
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Неправильные параметры в функцию все равно нужно отслеживать. И как - то об это наверх сообщать, если сами обработать не можем.
Files полон примеров на сей счет.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Algo писал(а):
Структурное программирование предполагает, что программа состоит из блоков операторов, которые либо выполняются либо не выполняются целиком. Предполагается, что такой подход значительно упрощает чтение и понимание текста программы.
GOTO, RETURN, BREAK, CONTINUE в глубине любого блока прерывает эту структуность.


RETURN, BREAK, CONTINUE - не прерывают, потому что их "действие" ограничивается текущим блоком. В отличие от GOTO, который никак не привязан к блоку.

Algo писал(а):
Обсуждаемый здесь пример из за своей просты не может показать преимущества стуктурного подхода.
Допустим, что тело цикла - 15-20 строк.


Не надо писать такие циклы. Серьезно. Одна, две, максимум - три строки.

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


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


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

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
Vlad писал(а):
RETURN, BREAK, CONTINUE - не прерывают, потому что их "действие" ограничивается текущим блоком. В отличие от GOTO, который никак не привязан к блоку.

Тем не менее у них нет строгого положения в блоке и структурность они всё равно нарушают.

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

Почему то, обычно, условия даже для длинных циклов трёх этажными не становятся.
Ещё есть возможность, в соответствии с задачами, возлагаемыми на тело цикла, ввести доп. логические переменные, которые условие сократят но не ухудшат понимания.
Перефразируя одного известного человека, можно сказать
"Не надо писать такие условия. Серьезно. Одна, две, максимум - три строки."
Если циклы должны быть на 1-2 строки, о чём вообще тогда сыр бор? Ратовать за то, чтобы в место "AND NOT <условие>" писать "IF <условие> THEN RETRUN"? И ради таких простых однострочных циклов заводить FOR, BREAK, CONTINUE и RETURN?
Получается 2 варианта: либо ухудшение читабельности, либо просто бессмысленное введение терминов, на проблему, не стоящую выеденного яйца.


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

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург
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;


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

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


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

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


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

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