OberonCore
https://forum.oberoncore.ru/

История с несколькими моралями (в том числе анти-FOR)
https://forum.oberoncore.ru/viewtopic.php?f=7&t=1443
Страница 3 из 7

Автор:  Евгений Темиргалеев [ Вторник, 07 Апрель, 2009 08:55 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
P.S. Только не надо опять начинать про то, что такие вольности (RETURN из FOR) позволяют писать кошмарный код. Да, позволяют. Но и более читабельный, чем обощенный WHILE - тоже позволяют.
Ваша читабельность с RETURN и FOR - закостенелые в мозгах неправильные паттерны. У правильно обученного студента проблем с читабельностью правильных паттернов не будет.

Автор:  Vlad [ Вторник, 07 Апрель, 2009 08:56 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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


Ну вот такие условия у типичного FOR - заданные итерации или выход через RETURN. Что не устраивает? Нужна гарантия отсутствия RETURN - придумайте свой FOR :) Менее практичный, но более строгий. В C++, например, есть std::for_each (из него нельзя сделать return :)

Автор:  Alexey_Donskoy [ Вторник, 07 Апрель, 2009 09:00 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Что-то в этом есть, конечно :)
Но вот тут мы уже вроде договорились, что в Дракон-схеме уже такого "кидалова" не получается, а получается всё просто и понятно.

Какой из этого следует вывод? А такой, что "договорённость" касательно итератора носит более психологический, характер, нежели характер принципиальной необходимости. И вообще - мелкий технический вопрос :)

Да, использование итератора для поиска, возможно, не совсем методически верно. Но - это ж просто элемент технической реализации...

Автор:  Alexey_Donskoy [ Вторник, 07 Апрель, 2009 09:04 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Евгений Темиргалеев писал(а):
Ваша читабельность с RETURN и FOR - закостенелые в мозгах неправильные паттерны.
Простите меня, пожалуйста, за занудство, но почему тот паттерн - правильный, а этот - неправильный?

Автор:  Валерий Лаптев [ Вторник, 07 Апрель, 2009 09:07 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Alexey_Donskoy писал(а):
Евгений Темиргалеев писал(а):
Ваша читабельность с RETURN и FOR - закостенелые в мозгах неправильные паттерны.
Простите меня, пожалуйста, за занудство, но почему тот паттерн - правильный, а этот - неправильный?

Вот именно!
Как говорится: А судьи-то кто?

Автор:  Евгений Темиргалеев [ Вторник, 07 Апрель, 2009 09:12 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Хотя бы потому, что
1) Не выбивается из общего подхода к построению цикла с инвариантом. Простейший пример.
2) Наработка этого паттерна параллельно нарабатывает навыки использования матлогики.
3) Не нарушает принципов структурного программирования.

Я думаю этого вполне достаточно, чтобы этот паттерн был правильным в преподавании. Пока не будет найдено более правильного.

Автор:  Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 09:24 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
Ну вот такие условия у типичного FOR - заданные итерации или выход через RETURN. Что не устраивает?

FOR, согласно определению\контракту - это цикл с заданным числом повторений. Вставка RETURN - нарушение контракта. Вы сперва говорите - "пройду все 10 элементов", а потом на 5-м номере вдруг спрыгиваете. Зачем тогда говорить "пройду все 10 элементов"? Бла-бла-шоу, вот что это такое.

Автор:  Евгений Темиргалеев [ Вторник, 07 Апрель, 2009 09:28 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Вот кстати ещё пункт + отдельно про читабельность. Vlad-у не стоит забывать, что FOR в КП и в Cи/Си++ и иже с ними совсем разные вещи.

Уточню сразу:
1) В КП - FOR - частный случай WHILE.
2) В Си/Си++ - while - частный случай for. За всякие явы/шарпы говорить не буду ибо точно не знаю.

Автор:  igor [ Вторник, 07 Апрель, 2009 09:42 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Иван Кузьмицкий писал(а):
FOR, согласно определению\контракту - это цикл с заданным числом повторений. Вставка RETURN - нарушение контракта. Вы сперва говорите - "пройду все 10 элементов", а потом на 5-м номере вдруг спрыгиваете. Зачем тогда говорить "пройду все 10 элементов"? Бла-бла-шоу, вот что это такое.
Замечу, что аналогичные рассуждения справедливы также и для WHILE. При нормальном выходе из WHILE мы знаем, что "условие продолжения" гарантировано не выполняется. Если же внутри WHILE стоит RETURN, то таких гарантий уже нет. Аналогично для REPEAT.

Автор:  Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 09:46 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Да, и если для понимания границ итератора достаточно посмотреть на условие цикла, то в случае с RETURN придётся анализировать весь код цикла. Это РАДИКАЛЬНО ухудшает читаемость. Вот такой поворот судьбы.

Автор:  Илья Ермаков [ Вторник, 07 Апрель, 2009 10:24 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Валерий Лаптев писал(а):
Здравая мысль. Но не кажется ли вам, Илья, что паттерны вполне можно заучивать и на С++?

Конечно, можно. Мне приходилось как-то учить на С++ (вытаскивать оставших студентов).
Только всё равно приходится вводить драконовские ограничения. Стоит ли игра свеч? А в коде у соседа они увидят другой кунштюк - и сразу вопрос "А почему мне так низя?" :)

P.S. По поводу "любил поиграть" - ну, мы тут когда-то в Орле тоже вдоволь "наигрались". Шаблоны же, вах :)

Автор:  Madzi [ Вторник, 07 Апрель, 2009 10:33 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Иван Кузьмицкий писал(а):
Да, и если для понимания границ итератора достаточно посмотреть на условие цикла, то в случае с RETURN придётся анализировать весь код цикла. Это РАДИКАЛЬНО ухудшает читаемость. Вот такой поворот судьбы.

Ну, ЧИТАЕМОСТЬ это не ухудшит, а вот ДОПОЛНИТЕЛЬНЫЙ объём работ по анализу кода - добавит.

Автор:  Madzi [ Вторник, 07 Апрель, 2009 10:39 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Игорь Лоскутов писал(а):
Иван Кузьмицкий писал(а):
FOR, согласно определению\контракту - это цикл с заданным числом повторений. Вставка RETURN - нарушение контракта. Вы сперва говорите - "пройду все 10 элементов", а потом на 5-м номере вдруг спрыгиваете. Зачем тогда говорить "пройду все 10 элементов"? Бла-бла-шоу, вот что это такое.
Замечу, что аналогичные рассуждения справедливы также и для WHILE. При нормальном выходе из WHILE мы знаем, что "условие продолжения" гарантировано не выполняется. Если же внутри WHILE стоит RETURN, то таких гарантий уже нет. Аналогично для REPEAT.

Я думаю что пора называть вещи своими именами. RETURN в цикле (WHILE, REPEAT, FOR) - это скрытый GOTO. А использование GOTO является нарушением принципа структурного программирования. Поэтому, конечно, цикл FOR с RETURN имеет право на жизнь, но в этом случае речь о структурном программировании вести не стоит.

Помниться есть такие правила Кодда, которые ограничивают базы данных, определяя Реляционную модель. Думаю что стоит вспомнить правила ограничивающие структурное программирование.

Надеюсь, что для всех очевидны преимущества СТУКТУРНОГО программирования, перед неструктурным.

Автор:  Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 10:53 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Madzi писал(а):
Ну, ЧИТАЕМОСТЬ это не ухудшит, а вот ДОПОЛНИТЕЛЬНЫЙ объём работ по анализу кода - добавит.

Я бы всё же сказал, что чтение всегда связано с анализом написанного.

Автор:  Madzi [ Вторник, 07 Апрель, 2009 10:59 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Иван Кузьмицкий писал(а):
Madzi писал(а):
Ну, ЧИТАЕМОСТЬ это не ухудшит, а вот ДОПОЛНИТЕЛЬНЫЙ объём работ по анализу кода - добавит.

Я бы всё же сказал, что чтение всегда связано с анализом написанного.

Я не спорю, что связано. Говоря что читаемость не ухудшится, я имел ввиду ЭРГОНОМИЧЕСКУЮ составляющую процесса. Энергетические затраты будут естественно выше, потому что будет анализ "лишнего кода", без которого можно было бы и обойтись, если бы мы чётко знали, что в цикл нам лезть не нужно. А знать мы это можем только в одном случае, когда из цикла нет другого выхода, а только по условию

Автор:  Иван Кузьмицкий [ Вторник, 07 Апрель, 2009 11:19 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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

Автор:  Axcel [ Вторник, 07 Апрель, 2009 14:00 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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

FOR i:= 0 TO Count-1 REPEAT
...
UNTIL "условие f(i)" END;

FOR i:= 0 TO Count-1 WHILE True DO f(i) END; а здесь WHILE можно опустить.

Мне кажется это бы решило некоторые проблемы, либо просто выкинуть FOR, что бы никого не путать.

Автор:  Vlad [ Вторник, 07 Апрель, 2009 15:18 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Иван Кузьмицкий писал(а):
FOR, согласно определению\контракту - это цикл с заданным числом повторений. Вставка RETURN - нарушение контракта. Вы сперва говорите - "пройду все 10 элементов", а потом на 5-м номере вдруг спрыгиваете. Зачем тогда говорить "пройду все 10 элементов"? Бла-бла-шоу, вот что это такое.


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

Автор:  Vlad [ Вторник, 07 Апрель, 2009 15:24 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Иван Кузьмицкий писал(а):
Да, и если для понимания границ итератора достаточно посмотреть на условие цикла, то в случае с RETURN придётся анализировать весь код цикла. Это РАДИКАЛЬНО ухудшает читаемость. Вот такой поворот судьбы.


Неправда. Границы в случае FOR как раз явно заданы (в отличие от WHILE, где они смешаны с "полезным" условием выхода). Так что анализировать надо больше в случае WHILE. О чем я и говорю с самого начала :)

Автор:  Vlad [ Вторник, 07 Апрель, 2009 15:35 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Madzi писал(а):
Я думаю что пора называть вещи своими именами. RETURN в цикле (WHILE, REPEAT, FOR) - это скрытый GOTO.


Ужас какой :) GOTO! :)

Madzi писал(а):
А использование GOTO является нарушением принципа структурного программирования.


Вы сначала докажите, что это GOTO :) А уж потом предавайте анафеме :)

Madzi писал(а):
Поэтому, конечно, цикл FOR с RETURN имеет право на жизнь, но в этом случае речь о структурном программировании вести не стоит.


В каком месте FOR c RETURN противоречит структурному программированию? При том, что он тривиально может быть преобразован к FOR без RETURN?

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

Страница 3 из 7 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/