OberonCore https://forum.oberoncore.ru/ |
|
Оператор Continue https://forum.oberoncore.ru/viewtopic.php?f=27&t=6735 |
Страница 1 из 2 |
Автор: | Peter Almazov [ Суббота, 06 Март, 2021 07:33 ] |
Заголовок сообщения: | Оператор Continue |
К Оберонам не относится. Но, если есть мысли, почему бы их не зафиксировать. Я никогда не использовал оператор continue. Считаю, что он годится только для умственно отсталых, которым «внезапно» требуется провалиться в конец цикла. Но тут пришлось работать с унаследованным кодом и признать, что continue имеет право на существование. Он может пригодиться для реализации обхода коллекции с фильтрацией элементов. В идеале надо бы написать что-то типа такого (псевдокод + LINQ) Код: ForEach elem in collection.Where(e => IsCorrect(e)) Do Когда приходится воплощать это вручную и использовать «if» на весь цикл, добавляется лишний уровень вложенности. Это не здорово, особенно, когда тело цикла приличное (не три строки). Здесь и сгодится нелюбимый continue:… Код: ForEach elem in collection Do Итак, кратко: только в начале цикла, для реализации фильтра.
If not IsCorrect(e)) Then continue EndIf …. |
Автор: | Валерий Лаптев [ Суббота, 06 Март, 2021 11:24 ] |
Заголовок сообщения: | Re: Оператор Continue |
Я его не использовал вообще НИКОГДА. Никогда не было нужды. Dreak еще использовал в начале освоения С++, но вот уже много лет и он мне не нужен. |
Автор: | Comdiv [ Суббота, 06 Март, 2021 12:01 ] |
Заголовок сообщения: | Re: Оператор Continue |
Peter Almazov писал(а): Код: ForEach elem in collection Do Итак, кратко: только в начале цикла, для реализации фильтра.If not IsCorrect(e)) Then continue EndIf …. Не пойму, почему не так? Код: ForEach elem in collection Do Всегда так делаю и считаю это правильным. Единственный недостаток, которым я всегда пренебрегаю, так это то, что когда условия изначально не было и его нужно добавить, то в отличии от варианта с continue требуется задевать отступами остальные строки, увеличивая изменения в системе контроля версий. Но с точки зрения ясности и ошибкоустойчивости это лучше.
If IsCorrect(e) Then … EndIf |
Автор: | Peter Almazov [ Суббота, 06 Март, 2021 13:02 ] |
Заголовок сообщения: | Re: Оператор Continue |
Comdiv писал(а): Не пойму, почему не так? Да Вы сами написали почему. И я об этом же.Код был чужой, а циклы на десятки строк. |
Автор: | Rifat [ Суббота, 06 Март, 2021 14:27 ] |
Заголовок сообщения: | Re: Оператор Continue |
На самом деле foreach способствует появлению break и continue. Проблема в том, что foreach сложно использовать, как цикл while, который часто бывает нужен. То есть, в while в условие просто можно написать, что пока не прошли все элементы или же не нашли нужный элемент, то итерировать. С циклом foreach же так просто не получится. Если нашли нужный элемент, то нужно или бессмысленно идти до конца или же выпрыгивать с помощью break. Поэтому я считаю, что foreach является "родственником" для break, continue и goto и по возможности его нужно не использовать. |
Автор: | Валерий Лаптев [ Суббота, 06 Март, 2021 14:31 ] |
Заголовок сообщения: | Re: Оператор Continue |
foreach и надо использовать только для полной обработки всех элементов контейнера. Для поиска он не годится. |
Автор: | Rifat [ Суббота, 06 Март, 2021 14:44 ] |
Заголовок сообщения: | Re: Оператор Continue |
Валерий Лаптев писал(а): foreach и надо использовать только для полной обработки всех элементов контейнера. Для поиска он не годится. Согласен. Там еще другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue. |
Автор: | Comdiv [ Суббота, 06 Март, 2021 16:20 ] |
Заголовок сообщения: | Re: Оператор Continue |
Peter Almazov писал(а): Comdiv писал(а): Не пойму, почему не так? Да Вы сами написали почему. И я об этом же.Код был чужой, а циклы на десятки строк. |
Автор: | Comdiv [ Суббота, 06 Март, 2021 16:28 ] |
Заголовок сообщения: | Re: Оператор Continue |
Rifat писал(а): На самом деле foreach способствует появлению break и continue. Тут, скорее, обратные причина и следствие. foreach был сделан таким, потому что есть break. Иначе, можно было бы снабдить цикл дополнительной конструкцией для структурного поиска. Но зачем, если есть более общий break, которым можно выскакивать из вложенных конструкций?
... другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue. |
Автор: | Trurl [ Суббота, 06 Март, 2021 18:40 ] |
Заголовок сообщения: | Re: Оператор Continue |
Недавно заменял Код: for (let e of array) { на Код: for (let e of array) if (cond(e)){
|
Автор: | adimetrius [ Суббота, 06 Март, 2021 21:16 ] |
Заголовок сообщения: | Re: Оператор Continue |
Comdiv писал(а): можно было бы снабдить цикл дополнительной конструкцией для структурного поиска А любопытно бы пример - приведите, пож. |
Автор: | adimetrius [ Суббота, 06 Март, 2021 21:27 ] |
Заголовок сообщения: | Re: Оператор Continue |
Мне кажется, RETURN из середины функции сродни continue и break. При неуемном использовании затрудняет понимание программы и поправки - логика получается очень хрупкой. По сути, это завуалированный GOTO, и реализован компилятором именно так. Нарушает структурированный принцип - один вход один выход. К сожалению (моему), в КП он есть, и в ББ встречается чаще, чем мне бы хотелось. Вот жду и надеюсь, может, выкинут его - Вирт же вроде выкинул из поздних Оберонов. И в раннем Паскале/72 их не было емнип. И еще даже в турбопаскале для функций писали Func := expr. А в позднем Обероне вроде и синтаксис приятнее стал - какое-то присваивание после END. |
Автор: | Peter Almazov [ Воскресенье, 07 Март, 2021 19:13 ] |
Заголовок сообщения: | Re: Оператор Continue |
Собственно, эта тема - о реализации шаблона "обход коллекции с фильтрацией элементов". Вот кусок кода отсюда. Раньше, увидев continue, я бы оценил этот кусок, скажем так, весьма скептически. А сейчас могу сказать, что это просто реализация шаблона: фильтрация пустых элементов. Код: foreach (var part in parts) {
if (string.IsNullOrEmpty(part)) continue; if (result.EndsWith("?") || part.StartsWith("?")) result = CombineEnsureSingleSeperator(result, part, '?'); else if (result.EndsWith("#") || part.StartsWith("#")) result = CombineEnsureSingleSeperator(result, part, '#'); else if (inFragment) result += part; else if (inQuery) result = CombineEnsureSingleSeperator(result, part, '&'); else result = CombineEnsureSingleSeperator(result, part, '/'); if (part.Contains("#")) { inQuery = false; inFragment = true; } else if (!inFragment && part.Contains("?")) { inQuery = true; } } |
Автор: | Trurl [ Воскресенье, 07 Март, 2021 19:35 ] |
Заголовок сообщения: | Re: Оператор Continue |
Да, каких только шаблонов не напридумывают. |
Автор: | Info21 [ Вторник, 09 Март, 2021 16:33 ] |
Заголовок сообщения: | Re: Оператор Continue |
Trurl писал(а): Да, каких только шаблонов не напридумывают. Забавно, что механизм, насколько можно понять, тот же, что и с придумыванием языков программирования.
|
Автор: | Пётр Кушнир [ Вторник, 09 Март, 2021 19:06 ] |
Заголовок сообщения: | Re: Оператор Continue |
Эти дятлы столько херни в циклах напридумывали, что другие дятлы решили просто отказаться от циклов, мол, теперь мы будем всё время ползать туда сюда по спискам, каждый раз. Дешевле десять раз пробежать по одному и тому же списку, чем научить двенадцать обезьян писать цикл Дейкстры без хаков и процедуры с одним RETURN. Ну а развитием этой шизофрении стала виртуальная "постоянная" итерация с реальным подковёрным построением цикла с обычными if-ами внутре и т.д. И все друг друга поддерживают и друг другу поддакивают, мол да, так и надо, это же прогресс, это же развитие, и у нас больше нет сложных тупых циклов с break и continue. Вот как здорово мы проблему решили. И функций с выходом из середины нет, теперь у нас всё есть выражение и всегда досчитывается до конца. А ещё у нас нет null и эксепшнов, вместо него мы держим в памяти тысячи пустотелых объектов типа ValueOrNull. Такой вот мир, а главное, его не инопланетяне здесь силой насаждают, это люди всё сами себе придумали, под тёплое мягкое групповое одобрение. |
Автор: | Info21 [ Вторник, 09 Март, 2021 23:08 ] |
Заголовок сообщения: | Re: Оператор Continue |
Изрядно сформулировано )) |
Автор: | TheAthlete [ Среда, 20 Ноябрь, 2024 12:30 ] |
Заголовок сообщения: | Re: Оператор Continue |
Думаю, лучше было бы сделать именование как в Perl: Код: continue -> next break -> last В целом, в Perl использование next вначале цикла является идиомой: Код: while (<>) { # построчно пройтись по файлу, очередную строку ложим в $_ chomp; next if /^\s+#/; # пропускаем строку, в которой встретился комментарий # остальной код } Но нужно еще попробовать в Обероне привести несколько примеров с использованием или без булевых переменных, для сравнения. Возможно, и не нужно будет добавлять оператор next. |
Автор: | Борис Рюмшин [ Среда, 20 Ноябрь, 2024 13:23 ] |
Заголовок сообщения: | Re: Оператор Continue |
Вот чего точно не нужно добавлять в Оберон. |
Автор: | arisu [ Среда, 20 Ноябрь, 2024 15:34 ] |
Заголовок сообщения: | Re: Оператор Continue |
вообще-то намного лучше добавить Parnas' generalised iterators. но я вот красивого синтаксиса для них придумать не могу. ;-) p.s.: лучшее, что я смог сочинить: Код: LOOP WHEN cond DO body AGAIN WHEN cond DO body EXIT END LOOP и, конечно, тот `LOOP`, что есть — аннигилировать. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |