OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 19 Июнь, 2021 00:23

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 07:33 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 561
Откуда: Москва
К Оберонам не относится. Но, если есть мысли, почему бы их не зафиксировать.

Я никогда не использовал оператор 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
   ….
Итак, кратко: только в начале цикла, для реализации фильтра.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 11:24 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3253
Откуда: Астрахань
Я его не использовал вообще НИКОГДА.
Никогда не было нужды.
Dreak еще использовал в начале освоения С++, но вот уже много лет и он мне не нужен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 12:01 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1289
Откуда: Киев
Peter Almazov писал(а):
Код:
ForEach elem in collection Do
   If not IsCorrect(e)) Then
      continue
   EndIf
   ….
Итак, кратко: только в начале цикла, для реализации фильтра.

Не пойму, почему не так?
Код:
ForEach elem in collection Do
   If IsCorrect(e) Then
      …
   EndIf
   
Всегда так делаю и считаю это правильным. Единственный недостаток, которым я всегда пренебрегаю, так это то, что когда условия изначально не было и его нужно добавить, то в отличии от варианта с continue требуется задевать отступами остальные строки, увеличивая изменения в системе контроля версий. Но с точки зрения ясности и ошибкоустойчивости это лучше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 13:02 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 561
Откуда: Москва
Comdiv писал(а):
Не пойму, почему не так?
Да Вы сами написали почему. И я об этом же.
Код был чужой, а циклы на десятки строк.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 14:27 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 975
Откуда: Казань
На самом деле foreach способствует появлению break и continue. Проблема в том, что foreach сложно использовать, как цикл while, который часто бывает нужен. То есть, в while в условие просто можно написать, что пока не прошли все элементы или же не нашли нужный элемент, то итерировать. С циклом foreach же так просто не получится. Если нашли нужный элемент, то нужно или бессмысленно идти до конца или же выпрыгивать с помощью break. Поэтому я считаю, что foreach является "родственником" для break, continue и goto и по возможности его нужно не использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 14:31 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3253
Откуда: Астрахань
foreach и надо использовать только для полной обработки всех элементов контейнера.
Для поиска он не годится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 14:44 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 975
Откуда: Казань
Валерий Лаптев писал(а):
foreach и надо использовать только для полной обработки всех элементов контейнера.
Для поиска он не годится.

Согласен.
Там еще другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 16:20 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1289
Откуда: Киев
Peter Almazov писал(а):
Comdiv писал(а):
Не пойму, почему не так?
Да Вы сами написали почему. И я об этом же.
Код был чужой, а циклы на десятки строк.
Вы писали про уровень вложенности, но с continue он никуда и не девается, а лишь становится менее явными в виде незримого Else.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 16:28 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1289
Откуда: Киев
Rifat писал(а):
На самом деле foreach способствует появлению break и continue.
...
другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue.
Тут, скорее, обратные причина и следствие. foreach был сделан таким, потому что есть break. Иначе, можно было бы снабдить цикл дополнительной конструкцией для структурного поиска. Но зачем, если есть более общий break, которым можно выскакивать из вложенных конструкций?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 18:40 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1372
Недавно заменял
Код:
for (let e of array) {
на
Код:
for (let e of array) if (cond(e)){


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 21:16 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 481
Comdiv писал(а):
можно было бы снабдить цикл дополнительной конструкцией для структурного поиска

А любопытно бы пример - приведите, пож.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Суббота, 06 Март, 2021 21:27 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 481
Мне кажется, RETURN из середины функции сродни continue и break. При неуемном использовании затрудняет понимание программы и поправки - логика получается очень хрупкой. По сути, это завуалированный GOTO, и реализован компилятором именно так. Нарушает структурированный принцип - один вход один выход. К сожалению (моему), в КП он есть, и в ББ встречается чаще, чем мне бы хотелось. Вот жду и надеюсь, может, выкинут его - Вирт же вроде выкинул из поздних Оберонов. И в раннем Паскале/72 их не было емнип. И еще даже в турбопаскале для функций писали Func := expr. А в позднем Обероне вроде и синтаксис приятнее стал - какое-то присваивание после END.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Воскресенье, 07 Март, 2021 19:13 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 561
Откуда: Москва
Собственно, эта тема - о реализации шаблона "обход коллекции с фильтрацией элементов".
Вот кусок кода отсюда. Раньше, увидев 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;
    }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Воскресенье, 07 Март, 2021 19:35 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1372
Да, каких только шаблонов не напридумывают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Вторник, 09 Март, 2021 16:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Trurl писал(а):
Да, каких только шаблонов не напридумывают.
Забавно, что механизм, насколько можно понять, тот же, что и с придумыванием языков программирования.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Вторник, 09 Март, 2021 19:06 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Эти дятлы столько херни в циклах напридумывали, что другие дятлы решили просто отказаться от циклов, мол, теперь мы будем всё время ползать туда сюда по спискам, каждый раз. Дешевле десять раз пробежать по одному и тому же списку, чем научить двенадцать обезьян писать цикл Дейкстры без хаков и процедуры с одним RETURN. Ну а развитием этой шизофрении стала виртуальная "постоянная" итерация с реальным подковёрным построением цикла с обычными if-ами внутре и т.д. И все друг друга поддерживают и друг другу поддакивают, мол да, так и надо, это же прогресс, это же развитие, и у нас больше нет сложных тупых циклов с break и continue. Вот как здорово мы проблему решили. И функций с выходом из середины нет, теперь у нас всё есть выражение и всегда досчитывается до конца. А ещё у нас нет null и эксепшнов, вместо него мы держим в памяти тысячи пустотелых объектов типа ValueOrNull. Такой вот мир, а главное, его не инопланетяне здесь силой насаждают, это люди всё сами себе придумали, под тёплое мягкое групповое одобрение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оператор Continue
СообщениеДобавлено: Вторник, 09 Март, 2021 23:08 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Изрядно сформулировано ))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

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


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

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


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

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